【问题标题】:Erase remove idiom on a std::string with non-printable characters throws exception擦除带有不可打印字符的 std::string 上的删除习语会引发异常
【发布时间】:2021-07-20 05:39:09
【问题描述】:

我正在通过管道从另一个进程中读取一些文本。管道将数据返回到变量chBuf,但包含许多不可打印的字符。我尝试使用擦除和删除来删除这些不可打印的字符,但抛出异常。该程序在没有此擦除删除线的情况下工作。我可能做错了什么?

 ReadFile(si->child_out_r, chBuf, BUFSIZE, &dwRead, NULL);
 string s(chBuf);
 s.erase(remove_if(s.begin(), s.end(), [](char c) { return !isprint((unsigned)c); }), s.end());
 cout << s;

【问题讨论】:

  • 如果 chBuf 不是以 null 结尾的,那么您将面临一段艰难时期。
  • 另外,如果空值出现在您的数据中(而不是在字符串的末尾),您将不会清理第一个空值之后的数据部分。
  • @Dave 有什么解决方案吗?我不想让它扔。我应该在第一次出现空字符时截断字符串吗?
  • 您可以使用string 构造函数,它采用以下长度:string s(chBuf, dwRead); 现在s 可能包含空值,并且它将包含所有数据。而且您的清洁过程也应该有效。另一种选择是使用vector&lt;char&gt; s(chBuf, dwRead);
  • @Dave: string s(chBuf, dwRead); 就像魅力一样。您可以发布 t 作为答案吗?这样我就可以结案了。谢谢

标签: c++ erase-remove-idiom


【解决方案1】:

如果您文件中的数据可能包含空值(在您感兴趣的其他字符中),或者不能保证最后有空值,那么您需要告诉std::string 它有多少数据应该用来构建字符串。您可以使用 std::string( const char *, size_t ) 构造函数来执行此操作:

std::string  s( chBuf, dwRead );

如果你这样做,字符串清理过程应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2011-04-17
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多