代码之家  ›  专栏  ›  技术社区  ›  Sijith

如何用wchar连接整数

  •  0
  • Sijith  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   gavinb    6 年前

    此代码存在许多问题:

    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位数字。
    • 用于存储转换字符串的缓冲区是一个宽字符长(对换行的初始化是无意义的),因此您将使用超过9的Salvo值溢出缓冲区。
    • 的第三个参数 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" .

        2
  •  0
  •   0___________    6 年前

    迈萨沃是警察,克里斯发现了他。

    最重要的是

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