如何使用wchar_t

时间:2019-01-23 11:12:19

标签: c visual-c++

我想用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

C中的IT

2 个答案:

答案 0 :(得分:1)

此代码存在很多问题:

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元素,因此即使它不是只读的,它也足够存储3位数字。
  • 用于存储转换后的字符串的缓冲区是一个宽字符长(并且对换行符的初始化是没有意义的),因此您将使salvo值大于9的缓冲区溢出。
  • itoa的第三个参数是数字底数,通常为10。具有数字底数1毫无意义。
  • 您正在使用wcscat写入一个常量字符串,即使该字符串足够长,它也是固定的。

因此,您需要了解很多基础知识。字符串分配,内存初始化,数组,常量变量和常量文字,等等。

您要尝试做的只是产生一个格式化的字符串。 sprintf family of string formatting functions提供了您可能需要的一切,以及一种安全的方式。

最简单的解决方案是这样的:

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"

答案 1 :(得分:0)

mySalvo是const-由Chris发现。

最重要的是

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";