Как объединить целое число с wchar_t - PullRequest
0 голосов
/ 23 января 2019

Я хочу объединить целое число с wchar_t, попробовал метод ниже, но его сбой

const wchar_t mySalvo[10] = L"Group:";  // THis is global
int salvo = 0;  
wchar_t buffer[1] = L"\n";
itoa(salvo, buffer, 1);
wcscat(mySalvo, buffer);  // app crashes here

IT в C

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Существует множество проблем с этим кодом:

const wchar_t mySalvo[10] = L"Group:";  // THis is global
int salvo = 0;  
wchar_t buffer[1] = L"\n";
itoa(salvo, buffer, 1);
wcscat(mySalvo, buffer);  // app crashes here
  • Прежде всего, использование глобальной не является наилучшей практикой.Кажется, нет веских причин для того, чтобы он был глобальным, поэтому просто сделайте его локальным там, где он вам нужен.
  • Во-вторых, вы указали, что это константная строка, и инициализировали ее какстроковый литерал, что означает, что он, вероятно, будет храниться в сегменте памяти, доступном только для чтения.Тем не менее, вы пишете в него с помощью wcscat (ваш компилятор наверняка предупредил вас ??).
  • Также строка ограничена 10 wchar_t элементами, поэтому даже если она не была прочитанатолько для хранения трехзначного числа будет достаточно долго.
  • буфер, предназначенный для хранения преобразованной строки, имеет длину один широкий символ (и инициализация новой строки не имеет смысла), поэтому вы переполните свой буфер с помощьюлюбое значение сальво выше 9.
  • третий параметр для itoa - это база чисел, которая обычно равна 10. Бессмысленно иметь номер базы 1.
  • you 'мы используем wcscat для записи в константную строку, которая является многословной, даже если предположить, что она достаточно длинная.

Так что здесь есть много основ, с которыми нужно смириться.Распределение строк, инициализация памяти, массивы, постоянные переменные и постоянные литералы и т. Д.

То, что вы пытаетесь сделать, - это просто создать отформатированную строку.Семейство sprintf функций форматирования строк предоставляет все, что вам может понадобиться, плюс безопасный способ сделать это.

Самое простое решение будет выглядеть примерно так:

void show_message(unsigned salvo)
{
    wchar_t message[64];
    swprintf_s(message, sizeof(message), L"Group: %u\n", salvo);

    // do something with message!
}

Итак, если вы позвоните show_message(123), результирующее значение в message будет: "Group: 123\n".

0 голосов
/ 23 января 2019

mySalvo является const - что было замечено Крисом.

И поверх него

wchar_t buffer[1] = L"\n";
itoa(salvo, buffer, 1); -
wcscat(mySalvo, buffer);  // app crashes here

это неопределенное поведение, поскольку у вас недостаточно места для размещения L"\n".Оба вызова вызывают UB.itoa не будет работать со строками wchar_t.Вам нужно найти соответствующую функцию.

попробуйте wchar_t buffer[2] = L"\n"; вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...