簡體   English   中英

字符串長度和內存泄漏

[英]char string length and memory leak

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。

第一個是正確的。 順便說一句,沒有內存泄漏。

-

我認為sprintf是C。還有更好的方法嗎?

是。 C ++方式:

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

7,因為sprintf將在字符串的末尾附加一個空字節'\\ 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支持這些功能,但是距我不幸與該編譯器抗爭已有10多年了,而我竭盡全力忘記了它的局限性。 我知道您要我不要,但我會說:使用較新的編譯器。 在過去的15年中,語言發生了很大變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM