Существует множество проблем с этим кодом:
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"
.