c - 如何用 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
解决方案
这段代码有很多问题:
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 值溢出缓冲区。
- 第三个参数 to
itoa
是基数,通常为 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"
。
推荐阅读
- java - 启用工具栏图标时如何显示汉堡图标
- javascript - 如何在 javascript 或 MySQL 中对数据透视动态数组进行分组?
- sails.js - SailsJS 中的全局模型无法访问
- c++ - 如何使用 unique_ptr 进行迭代?
- reactjs - store.subscribe() 在状态更改时无法在辅助服务功能中工作
- java - A* 算法完成但返回次优路径
- objective-c - 苹果手表处于睡眠模式时如何执行代码
- usdz - 转换为 USDZ 后显示为透明的对象
- jenkins - 根据选择触发依赖构建以将其作为独立构建运行
- android - 如何在不每次都构建的情况下加载路线?