char字符串长度和内存泄漏

时间:2011-09-09 18:38:55

标签: c++ memory-leaks char vc6

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。

4 个答案:

答案 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年里,语言发生了很大的变化。