我有以下代码,但它会导致异常。如果没有itoa“游戏”,我认为没有问题。 TextOutA是因为我使用winapi。
char* p1 = new char[2];
itoa(10,p1,10);
TextOutA(hDC,5, currenty,p1,2);
delete[] p1;
答案 0 :(得分:7)
你的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());
}
答案 1 :(得分:2)
您没有分配足够的空间来存储“10”,因为与所有C字符串一样,它需要N + 1个字符,其中N是字符串的长度。最后一个字符是空终止符。您应该分配3个字符(或更多)。或者使用snprintf
。或std::stringstream
。
以下是使用itoa
的{{3}}个数,假设您不需要专门的基数格式(虽然其中一些也可以这样做)。
答案 2 :(得分:0)
您没有为字符串分配足够的空间。
char* p1 = new char[2];
itoa(10,p1,10);
p1
长度为2个字节,仅适用于1个字符的字符串(另一个字符是nul终结符)。你应该把它做得足够长,以保持任何可能的结果,对于32位系统,基数= 10,结果为11。