snprintf的无符号长追加逗号
snprintf of unsigned long appending a comma
我尝试将unsigned long
转换为字符串,并在其末尾添加一个逗号。在编译和运行下面的测试代码时,我得到以下输出:
"1234," "1234"
"1234"
测试代码为:
#include <cstdio>
#include <iostream>
int main () {
unsigned long c = 1234;
char ch[50];
char ch1[50];
sprintf(ch, "%lu,", c);
std::cout << """ << ch << """ << " "" << c << """ << std::endl;
snprintf(ch1, 5, "%s", ch);
std::cout << """ << ch1 << """ << std::endl;
return 1;
}
据我所知,ch
的长度应该是5,4位数字加上逗号的1。
我是否错过了终止字符的一个额外的加号?
干杯!
传递给snprintf
的大小包括终止的null字符。虽然没有打印,但它仍然占用缓冲区中的空间。
你应该通过strlen(ch) + 1
。或者更好的是,仅仅sizeof(ch1)
就足够了,因为您希望在填充缓冲区之前容纳整个结果。
还要确保目标缓冲区始终具有足够的大小,等于或大于传递给snprintf
的大小。在你的特殊情况下,这几乎不可能发生,但总的来说,你应该记住这一点。
从Linux手册页面:
函数snprintf()和vsnprintf()将最大大小的字节(包括尾部空字节("\0"))写入str.
所以,是的,你应该有一个长度为6的逗号。
C++方式:
#include <string>
unsigned long int c = 1234;
std::string s = """ + std::to_string(c) + ","";
std::string t = '"' + std::to_string(c) + ',' + '"'; // alternative
正如您所写的,您为终止字符错过了一个额外的空间。
函数snprintf()和vsnprintf()写入的字节数最多(包括终止的空字节("\0"))到str.
正如一些人所指出的,您需要为null终止符包含足够的空间。
总是值得检查snprintf返回的结果是否也是您认为应该的结果。
最后,我建议使用snprintf(buffer、sizeof(buffer)等)
如果第二个参数恰好大于实际可用空间,则不太可能得到令人尴尬的结果。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- snprintf的无符号长追加逗号
- 用于将后缀追加到无符号长文本的宏