【问题标题】:C++ std::string problem using VC10使用 VC10 的 C++ std::string 问题
【发布时间】:2011-06-23 01:03:26
【问题描述】:

我在 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结束 “附加的字符串”

有谁知道这是否是一个已知问题?或者如果我错过了什么

我把它放在下面的 cmets 中,但如果我把它也放在这里可能会更好

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

bytesRead:如果读取,则 > 0...所以可以将缓冲区视为 ASCIIZ,

我尝试了附加功能,但获得了相同的行为(比如这个 str.append(buffer); )

问候 豪尔赫

【问题讨论】:

  • 你是如何处理缓冲区末尾的字符 \0 的?如果你不这样做,那看起来就像结果。请出示您的代码,不要遗漏任何重要内容。
  • 你能发布ReadChars的实现吗?几乎可以肯定,该错误在于该函数对buffer 的处理
  • 您可能将空字符放在 buffer 中的错误偏移处
  • 我按照您的建议将 char 0 添加到示例中,如果您想知道,是的,它在原始代码中:)

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


【解决方案1】:

这是您的实际代码吗? “照顾 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);

【讨论】:

  • buffer[bytesRead] = '\0'; ---> str += buffer;
  • 是的,除非bytesRead == BUFFER_SIZE :)
  • @Marlon:当您只需要读取时,为什么还要执行额外的写入操作?此外,当将随机访问迭代器(char* 是)传递给std::string::append() 时,该函数可以预先计算添加的序列的长度,而如果您只传递一个char*,它就不能。如果它事先知道所需的长度,它可以预先分配内存,而不是不断增长直到找到'\0'。无论如何,假设 ReadChars() 不应该附加 '\0' 本身,这是 IMO 最好的解决方案。
  • 不是确切的代码,我修改它以使其简单,只是一个示例.. 但让我再解释一下,ReadChars:读取一堆字符,最后我们有 char 0 , bytesRead: 如果读取,则 > 0... 可以将缓冲区视为 ASCIIZ,我尝试使用 append 函数但获得相同的行为
  • 其实我没有像你那样使用append,我是这样使用str.append(buffer);我会尽力让你知道,谢谢
【解决方案2】:

如果没有关于 ReadChars 的信息,这看起来完全正确,就像 buffer 不会以 null 终止,并且 std::string 正在从缓冲区中追加字符,直到它在内存中达到随机 0。 p>

【讨论】:

  • 好吧不是完全随机的,它总是来自附加信息的 7 或 8 个字符
【解决方案3】:

您说您已经处理了末尾的“0”...您确定没有从您尝试附加的每个字符串的末尾删除空格字符吗?

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2010-10-26
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多