我在Windows 7上使用C ++,Visual Studio 2010 Premium,在我的应用程序中,我有一个std :: string变量无法追加:( ...
情况是,字符串变量包含在不同时间附加的大量字符,第一次添加例如7609字节,第二次8184,最后是1463,类似
std::string str;
long bytesRead;
char buffer[BUFFER_SIZE];
do {
bytesRead = ReadChars(buffer, BUFFER_SIZE -1);
buffer[bytesRead] = 0; // I omitted this line before, but it was in the original code
if (bytesRead > 0)
str += buffer; // I'm already taking care of the char 0 at the end :)
} while (bytesRead > 0);
所以每当我调用+ =(或追加,相同的结果)时,它会附加一个额外的字符串(例如,来自原始缓冲区的最后7或8个字符)
原始缓冲区结束 “附加字符串”
追加后,str结束 “字符串附加”
有谁知道这是否是一个已知问题?或者如果我错过了什么
我把它放在那里的评论中,但如果我把它放在这里也许会更好
ReadChars :读取一个字符的bounch并返回读取的字节数
bytesRead :如果读取,则为> 0 ...所以可以将缓冲区视为ASCIIZ,
我尝试使用append函数但获得相同的行为(比如str.append(buffer);)
此致 乔治
答案 0 :(得分:5)
这段代码是您的实际代码吗? “照顾char 0”是什么意思?
do {
bytesRead = ReadChars(buffer, BUFFER_SIZE);
if (bytesRead > 0)
str += buffer; // I'm already taking care of the char 0 at the end :)
} while (bytesRead > 0);
在您的示例中,您始终将整个缓冲区附加到字符串,实际上忽略bytesRead
。所以std::string
将从buffer
读取,直到找到一个NULL字节 - 这可能会导致溢出,当然不是你想要的。
您必须告诉buffer
要追加的字节数。请尝试以下方法:
do {
bytesRead = ReadChars(buffer, BUFFER_SIZE);
if (bytesRead > 0)
str.append(buffer, buffer + bytesRead);
} while (bytesRead > 0);
答案 1 :(得分:0)
你说你已经在最后处理了“0”...你确定你没有从你试图追加的每个字符串的末尾删除空格字符吗?
答案 2 :(得分:0)
如果没有关于ReadChars
的信息,那么完全 就像buffer
一样,不会终止空值而std::string
会从缓冲区附加字符,直到它随机命中内存为0。