snignedf of unsigned long附加逗号

我尝试将unsigned long转换为字符串,并在其末尾添加逗号。 在编译和运行下面的测试代码时,我得到以下输出:

 "1234," "1234" "1234" 

测试代码是:

 #include  #include  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的大小包括终止空字符。 虽然它没有打印,但它仍然占用缓冲区空间。

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

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

从Linux手册页 :

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

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

C ++方式:

 #include  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)等)

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