snprintf的无符号长追加逗号

snprintf of unsigned long appending a comma

本文关键字:追加 无符号 snprintf      更新时间:2023-10-16

我尝试将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)等)

如果第二个参数恰好大于实际可用空间,则不太可能得到令人尴尬的结果。