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)等)
如果第二个参数恰好大于您可用的实际空间,则不太可能获得令人尴尬的结果。