int fCount = 0;
char frameNum[7];
sprintf(frameNum, %06u", fCount);
int fCount = 0;
char frameNum[6];
sprintf(frameNum, %06u", fCount);
Q1。哪个是正确的,6或7?
Q2。我使用的是VC6,文件是sample.cpp 我认为sprintf是C.有更好的方法吗? 我需要右对齐的char字符串和填充的零。
请不要告诉我使用更新的编译器。我现在需要使用VC6。
答案 0 :(得分:3)
第一个是正确的。顺便说一下,没有内存泄漏。
-
我认为sprintf是C.有更好的方法吗?
是。 C ++方式:
std::stringstream ss; //#include <sstream>
ss << fCount;
std::string frameNum = ss.str();
答案 1 :(得分:0)
7,因为sprintf会在字符串的末尾附加一个空字节'\ 0'。
答案 2 :(得分:0)
两者都不会发生内存泄漏 - 数据存在于堆栈中!
答案 3 :(得分:0)
Q1。哪个是正确的,6或7?
都不是。格式字符串中的6是最小宽度,因此如果fCount >= 1000000
,则7个字符是不够的。任何输入都不会溢出的最小大小为std::numeric_limits<int>::digits10 + 2
(允许所有十进制数字,终止字符和输入为负数时的符号)。假设VC6提供<numeric_limits>
;否则sizeof(int)*3 + 2
是一个合理的上限。如果您想确定,请致电snprintf
并检查返回值。
Q2。我使用的是VC6,文件是sample.cpp。 我认为sprintf是C.有更好的方法吗?我需要右对齐的char字符串和填充的零。
在大多数情况下,最好使用C ++字符串和流来管理自己的内存,除非你做一些非常奇怪的事情,否则不会溢出。
std::ostringstream s;
s << setw(6) << setfill('0') << fCount;
std::string frameNum = s.str();
我很确定VC6支持这些,但是自从我不幸与该编译器竞争已经过去十多年了,我已经尽力忘记它究竟有多受限制。我知道你让我不要,但我会说:使用更新的编译器。在过去的15年里,语言发生了很大的变化。