C++;使用VC10时出现的字符串问题 我使用C++,Visual Studio 2010高级版在Windows 7上,在我的应用程序中,我有一个在附件中失败的STD:String变量:(……< / P>)

C++;使用VC10时出现的字符串问题 我使用C++,Visual Studio 2010高级版在Windows 7上,在我的应用程序中,我有一个在附件中失败的STD:String变量:(……< / P>),c++,string,visual-studio-2010,windows-7,C++,String,Visual Studio 2010,Windows 7,情况是,字符串变量包含大量在不同时间追加的字符,第一次添加例如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 wa

情况是,字符串变量包含大量在不同时间追加的字符,第一次添加例如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); 
所以,每次我调用+=(或append,相同的结果)时,它都会附加一个额外的字符串(原始缓冲区的最后7或8个字符)

原始缓冲区结束 “附加字符串”

在append之后,str结束 “字符串已附加”

有人知道这是不是一个已知的问题吗?或者如果我错过了什么

我把它放在下面的评论里,但是如果我也放在这里,也许会更好

ReadChars:读取字符数并返回读取的字节数

字节读取:如果读取,则它大于0…因此可以将缓冲区视为ASCIIZ

我尝试使用append函数,但得到了相同的行为(如str.append(buffer);)

问候
Jorge

您说您已经处理了结尾处的“0”…您确定没有从试图追加的每个字符串的结尾删除空格字符吗?

您说您已经处理了“0”在结尾…您确定没有从试图追加的每个字符串的结尾删除空格字符吗?

这段代码是您的实际代码吗?您说的“处理字符0”是什么意思

在您的示例中,您总是将整个缓冲区附加到字符串中,实际上忽略了
bytesRead
。因此
std::string
将从
buffer
中读取,直到找到空字节——这可能会导致溢出,当然不是您想要的

您必须告诉要从
缓冲区添加多少字节。请尝试以下操作:

do { 
   bytesRead = ReadChars(buffer, BUFFER_SIZE); 
   if (bytesRead > 0)
       str.append(buffer, buffer + bytesRead);
} while (bytesRead > 0);

这段代码是您的实际代码吗?您所说的“处理字符0”是什么意思

在您的示例中,您总是将整个缓冲区附加到字符串中,实际上忽略了
bytesRead
。因此
std::string
将从
buffer
中读取,直到找到空字节——这可能会导致溢出,当然不是您想要的

您必须告诉要从
缓冲区添加多少字节。请尝试以下操作:

do { 
   bytesRead = ReadChars(buffer, BUFFER_SIZE); 
   if (bytesRead > 0)
       str.append(buffer, buffer + bytesRead);
} while (bytesRead > 0);


如果没有关于
ReadChars
的信息,这看起来就像
buffer
不会以null结尾,并且
std::string
会从缓冲区中追加字符,直到它在内存中随机命中0。

如果没有关于
ReadChars
的信息,这看起来就像
buffer
不会得到null termiNad和
std::string
正在从缓冲区中添加字符,直到它在内存中随机命中0。

您如何处理缓冲区末尾的字符\0?如果没有,则看起来像是结果。请显示代码,但不要忽略任何重要内容。您能发布ReadChars的实现吗?错误几乎是肯定的主要是在该函数处理
buffer
时,您可能在
buffer
中将空字符放在了错误的偏移量处。我按照您的建议将字符0添加到示例中,如果您想知道,是的,它在原始代码中:)您如何处理缓冲区末尾的字符\0?如果你不这么做的话,结果会是这样的。请显示您的代码,不要遗漏任何重要内容。您可以发布ReadChars的实现吗?这个错误几乎可以肯定是在该函数处理
buffer
的过程中,您可能在
buffer
中将空字符放在了错误的偏移量处,我按照您的建议将字符0添加到了示例中,如果您想知道,是的,它在原始代码中:)或
buffer[bytesRead]='\0'-->
str+=buffer
是的,除非
bytesRead==BUFFER\u SIZE
:)@Marlon:如果你只需要读取,为什么还要执行额外的写操作呢?另外,当将随机访问迭代器(即
char*
传递给
std::string::append()
时,该函数可以预先计算添加的序列的长度,而如果只传递一个
char*
,则不能。如果它事先知道所需的长度,它可以预先分配内存,而不是在找到
'\0'
之前不断增长。无论如何,假设
ReadChars()
不应该附加
'\0'
本身,在我看来,这是最好的解决方案。这不是确切的代码,我修改它以使其简单,只是一个例子。。但是让我再解释一下,读字符:读一段字符,最后我们得到了字符0,bytesRead:如果读,它是>0。。。所以,好吧,把缓冲区当作ASCIIZ,我尝试了append函数,但得到了相同的行为。事实上,我没有像你们一样使用append,我使用的是str.append(buffer);我会试着让你知道的,谢谢你或
buffer[bytesRead]='\0'-->
str+=buffer
是的,除非
bytesRead==BUFFER\u SIZE
:)@Marlon:如果你只需要读取,为什么还要执行额外的写操作呢?另外,当将随机访问迭代器(即
char*
传递给
std::string::append()
时,该函数可以预先计算添加的序列的长度,而如果只传递一个
char*
,则不能。如果它事先知道所需的长度,它可以预先分配内存,而不是在找到
'\0'
之前不断增长。无论如何,假设
ReadChars()
不应该附加
'\0'
本身,在我看来,这是最好的解决方案。这不是确切的代码,我修改它以使其简单,只是一个例子。。但是让我再解释一下,读字符:读一段字符,最后我们得到了字符0,bytesRead:如果读,它是>0。。。所以,若要将缓冲区视为ASCIIZ,我尝试使用append函数,但得到了相同的行为,事实上我并没有