擦除带有不可打印字符的 std::string 上的删除成语抛出异常

问题描述

我正在通过管道从另一个进程读取一些文本。管道将数据返回到变量 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;

解决方法

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

std::string  s( chBuf,dwRead );

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