我正在尝试修改使用此行的某人的代码:
out.write(&vecBuffer[0], x.length());
但是,我想事先修改缓冲区,以便删除我不想输出的任何坏字符。例如,如果缓冲区是“Test%string”并且我想去掉 %,我想将缓冲区更改为“Test string”或“Teststring”,以更容易为准。
我正在尝试修改使用此行的某人的代码:
out.write(&vecBuffer[0], x.length());
但是,我想事先修改缓冲区,以便删除我不想输出的任何坏字符。例如,如果缓冲区是“Test%string”并且我想去掉 %,我想将缓冲区更改为“Test string”或“Teststring”,以更容易为准。
std::replace
将允许用另一个特定字符替换一个特定字符,例如'%'
用' '
. 只需正常调用它:
std::replace( vecBuffer.begin(), vecBuffer.end(), '%', ' ' );
将 替换'%'
为谓词对象 call replace_if
,您可以替换谓词对象返回的任何字符true
。但总是具有相同的性格。为了获得更大的灵活性,std::transform
您可以传递一个函数,该函数接受 achar
并返回 a char
; 它将在缓冲区中的每个字符上调用。
或者,您可以执行以下操作:
vecBuffer.erase(
std::remove( vecBuffer.begin(), vecBuffer.end(), '%' ).
vecBuffer.end() );
删除字符。在这里,您也可以替换remove
为remove_if
,并使用谓词,它可以匹配许多不同的字符。
您可以使用的最简单的库可能是Boost String Algorithms库。
boost::replace_all(buffer, "%", "");
将在原地替换所有出现的%
无。您可以指定" "
为替代品,甚至可以指定"REPLACEMENT"
为适合您的。
std::string str("Test string");
std::replace_if(str.begin(), str.end(), boost::is_any_of(" "), '');
std::cout << str << '\n';
您不需要使用 boost 库。最简单的方法是使用标题%
中的 std::replace() 将字符替换为空格:<algorithm>
std::replace(vecBuffer.begin(), vecBuffer.end(), '%', ' ');
我假设 ,vecBuffer
顾名思义,是一个 std::vector。如果它实际上是一个普通数组(或指针),那么你会这样做:
std::replace(vecBuffer, vecBuffer + SIZE_OF_BUFFER, '%', ' ');
SIZE_OF_BUFFER 应该是数组的大小(如果您不想转换整个缓冲区,则应该是要处理的数组中的字符数。)
假设你有一个功能
bool goodChar( char c );
这会返回true
您被批准的角色,false
否则,那么怎么样
void fixBuf( char* buf, unsigned int len ) {
unsigned int co = 0;
for ( unsigned int cb = 0 ; cb < len ; cb++ ) {
if goodChar( buf[cb] ) {
buf[co] = buf[cb];
co++;
}
}
}