Erase remove idiom on a std::string with non-printable characters throws exception
Erase remove idiom on a std::string with non-printable characters throws exception
我正在通过管道从另一个进程读取一些文本。管道 returns 数据到变量 chBuf
但包含许多不可打印的字符。我尝试使用 erase and remove 删除这些不可打印的字符,但抛出了异常。该程序在没有此擦除删除行的情况下工作。我可能做错了什么?
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 );
如果您这样做,字符串清理过程应该可以正常工作。
我正在通过管道从另一个进程读取一些文本。管道 returns 数据到变量 chBuf
但包含许多不可打印的字符。我尝试使用 erase and remove 删除这些不可打印的字符,但抛出了异常。该程序在没有此擦除删除行的情况下工作。我可能做错了什么?
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 );
如果您这样做,字符串清理过程应该可以正常工作。