我有以下代碼,但它會導致異常。沒有itoa「遊戲」我不認爲有問題。 TextOutA是因爲我使用winapi。新增和刪除char *導致異常
char* p1 = new char[2];
itoa(10,p1,10);
TextOutA(hDC,5, currenty,p1,2);
delete[] p1;
我有以下代碼,但它會導致異常。沒有itoa「遊戲」我不認爲有問題。 TextOutA是因爲我使用winapi。新增和刪除char *導致異常
char* p1 = new char[2];
itoa(10,p1,10);
TextOutA(hDC,5, currenty,p1,2);
delete[] p1;
你的StringBuffer太短
itoa溢出緩衝區容量以書面空終止字符。
char* p1 = new char[3];
itoa(10,p1,10);
TextOutA(hDC,5, currenty,p1,2);
delete[] p1;
我建議你製作足夠大的緩衝區以容納整個整數範圍。
編輯以防萬一,詳細闡述了字符串流建議:
#include <sstream>
//....
{
std::stringstream ss;
ss << 10;
std::string s = ss.str();
TextOutA(hDC, 5, currenty, s.c_str(), s.length());
}
您還沒有分配足夠的空間來存儲「10」,因爲,像所有的C字符串,它需要N + 1個字符,其中N是字符串的長度。最後一個字符是空終止符。您應該分配3個字符(或更多)。或使用snprintf
。或者std::stringstream
。
這裏有一些much better alternatives使用itoa
,假設你不需要專門的基數格式(儘管其中一些也可以)。
您不爲字符串分配足夠的空間。
char* p1 = new char[2];
itoa(10,p1,10);
p1
是2個字節長,這是僅適用於1個字符的字符串足夠(另一個字符就是空終止子)。您應該保留足夠長的時間以保留任何可能的結果,對於32位系統和base = 10,結果將爲11。
我建議使用'std :: ostringstream'和'std :: string',而不必擔心緩衝區的大小。 (在這種簡單的情況下,你可以使用'boost :: lexical_cast'。) –
@James:那當然是 – sehe
非常感謝你的快速響應!工作! – dusm