字符串长度和内存泄漏
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。有更好的方法吗? 我需要字符串右对齐并填充零。
请不要告诉我使用更新的编译器。我现在需要使用VC6。
int fCount = 0;
char frameNum[7];
sprintf(frameNum, %06u", fCount);
int fCount = 0;
char frameNum[6];
sprintf(frameNum, %06u", fCount);
Q1. Which is correct, 6 or 7?
Q2. I am using VC6 and the file is sample.cpp.
I think sprintf is C. Is there a better way?
I need the char string right justified and with padded zeros.
Please don't tell me to use a newer compiler. I need to use VC6 for now.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
第一个是正确的。顺便说一句,没有内存泄漏。
--
是的。 C++方式:
First one is correct. There is no memory leak, by the way.
--
Yes. C++ way:
7、因为 sprintf 会在字符串末尾附加一个空字节 '\0'。
7, as sprintf will append a null byte '\0' to the end of the string.
两者都不会发生内存泄漏——数据在堆栈上!
Neither will be a memory leak - the data is on the stack!
两者都不。格式字符串中的 6 是最小宽度,因此如果
fCount >= 1000000
,7 个字符将不够。任何输入都不会溢出的最小大小是std::numeric_limits::digits10 + 2
(以允许所有十进制数字、终止字符以及输入时的符号)为负数)。假设VC6提供
;否则sizeof(int)*3 + 2
是一个合理的上限。如果您想确定,请调用snprintf
并检查返回值。在大多数情况下,您最好使用 C++ 字符串和流,它们管理自己的内存并且不会溢出,除非您做了一些非常奇怪的事情。
我相当确定 VC6 支持这些,但自从我不幸与该编译器战斗以来已经十多年了,而且我已经尽力忘记它到底有多么有限。我知道你要求我不要这样做,但我会说:使用更新的编译器。在过去 15 年里,语言发生了很大变化。
Neither. The 6 in the format string is a minimum width, so 7 characters will not be enough if
fCount >= 1000000
. The smallest size that won't overflow for any input isstd::numeric_limits<int>::digits10 + 2
(to allow for all the decimal digits, the terminating character, and the sign if the input is negative). Assuming that VC6 provides<numeric_limits>
; otherwisesizeof(int)*3 + 2
is a reasonable upper bound. If you want to be sure, callsnprintf
and check the return value.In most cases you're better off using C++ strings and streams, which manage their own memory and won't overflow unless you do something very strange.
I'm fairly sure VC6 supports these, but it's been over a decade since I had the misfortune to battle with that compiler, and I've done my best to forget exactly how limited it was. I know you asked me not to, but I will say: use a newer compiler. The language has changed a lot in the last 15 years.