首页 > 解决方案 > 如何用 wchar_t 连接整数

问题描述

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

标签: cvisual-c++

解决方案


这段代码有很多问题:

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 值溢出缓冲区。
  • 第三个参数 toitoa是基数,通常为 10。以 1 为基数是没有意义的。
  • 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"


推荐阅读