snignedf of unsigned long附加逗号

时间:2012-02-03 09:47:49

标签: c++ c printf

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

对于终止角色,我是否会错过一个额外的加号?

干杯!

5 个答案:

答案 0 :(得分:3)

传递给snprintf的大小包括终止空字符。虽然它没有打印,但它仍然占用缓冲区空间。

您应该通过strlen(ch) + 1。或者甚至更好,只需要sizeof(ch1)就足够了,因为你想在填充缓冲区之前容纳整个结果。

还要确保目标缓冲区的大小始终足够大,等于或大于传递给snprintf的大小。在你的特殊情况下,它很难发生,但总的来说你应该牢记这一点。

答案 1 :(得分:1)

来自Linux manual page

  

函数snprintf()和vsnprintf()将最多大小字节(包括尾随空字节('\ 0'))写入str。

所以是的,你应该有6的长度来获得逗号。

答案 2 :(得分:1)

C ++方式:

#include <string>

unsigned long int c = 1234;

std::string s = "\"" + std::to_string(c) + ",\"";
std::string t = '"' +  std::to_string(c) + ',' + '"'; // alternative

答案 3 :(得分:0)

正如您所写,您错过了终止角色的额外空间。

  

函数snprintf()和vsnprintf()最多写入大小字节   (包括终止空字节('\ 0'))到str。

答案 4 :(得分:0)

正如几个人所指出的那样,你需要为null终止符包含足够的空间。

总是值得检查从snprintf返回的结果是你认为它应该是什么。

最后,我建议使用snprintf(buffer,sizeof(buffer)等)

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