[英]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.