使用VC10的C ++ std :: string问题

时间:2011-02-07 21:25:34

标签: c++ string visual-studio-2010 windows-7

我在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);)

此致 乔治

3 个答案:

答案 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。