我尝试将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。
对于终止角色,我是否会错过一个额外的加号?
干杯!
答案 0 :(得分:3)
传递给snprintf
的大小包括终止空字符。虽然它没有打印,但它仍然占用缓冲区空间。
您应该通过strlen(ch) + 1
。或者甚至更好,只需要sizeof(ch1)
就足够了,因为你想在填充缓冲区之前容纳整个结果。
还要确保目标缓冲区的大小始终足够大,等于或大于传递给snprintf
的大小。在你的特殊情况下,它很难发生,但总的来说你应该牢记这一点。
答案 1 :(得分:1)
答案 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)等)
如果第二个参数恰好大于您可用的实际空间,则不太可能获得令人尴尬的结果。