字符串长度和内存泄漏

发布于 2024-12-03 20:01:10 字数 305 浏览 0 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

空心空情空意 2024-12-10 20:01:10

第一个是正确的。顺便说一句,没有内存泄漏。

--

我认为sprintf是C语言,有更好的方法吗?

是的。 C++方式:

std::stringstream ss;  //#include <sstream>
ss << fCount;
std::string frameNum = ss.str();

First one is correct. There is no memory leak, by the way.

--

I think sprintf is C. Is there a better way?

Yes. C++ way:

std::stringstream ss;  //#include <sstream>
ss << fCount;
std::string frameNum = ss.str();
狼性发作 2024-12-10 20:01:10

7、因为 sprintf 会在字符串末尾附加一个空字节 '\0'。

7, as sprintf will append a null byte '\0' to the end of the string.

韵柒 2024-12-10 20:01:10

两者都不会发生内存泄漏——数据在堆栈上!

Neither will be a memory leak - the data is on the stack!

染墨丶若流云 2024-12-10 20:01:10

Q1。 6 和 7 哪一个是正确的?

两者都不。格式字符串中的 6 是最小宽度,因此如果 fCount >= 1000000,7 个字符将不够。任何输入都不会溢出的最小大小是 std::numeric_limits::digits10 + 2 (以允许所有十进制数字、终止字符以及输入时的符号)为负数)。假设VC6提供;否则 sizeof(int)*3 + 2 是一个合理的上限。如果您想确定,请调用 snprintf 并检查返回值。

第二季度。我使用的是VC6,文件是sample.cpp。
我认为sprintf是C。有更好的方法吗?我需要字符字符串右对齐并填充零。

在大多数情况下,您最好使用 C++ 字符串和流,它们管理自己的内存并且不会溢出,除非您做了一些非常奇怪的事情。

std::ostringstream s;
s << setw(6) << setfill('0') << fCount;
std::string frameNum = s.str();

我相当确定 VC6 支持这些,但自从我不幸与该编译器战斗以来已经十多年了,而且我已经尽力忘记它到底有多么有限。我知道你要求我不要这样做,但我会说:使用更新的编译器。在过去 15 年里,语言发生了很大变化。

Q1. Which is correct, 6 or 7?

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 is std::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>; otherwise sizeof(int)*3 + 2 is a reasonable upper bound. If you want to be sure, call snprintf and check the return value.

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.

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.

std::ostringstream s;
s << setw(6) << setfill('0') << fCount;
std::string frameNum = s.str();

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文