この行を使用する誰かのコードを変更しようとしています:
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
関数を渡す があります。バッファ内の各文字で呼び出されます。char
char
または、次のようなこともできます。
vecBuffer.erase(
std::remove( vecBuffer.begin(), vecBuffer.end(), '%' ).
vecBuffer.end() );
文字を削除するには。ここでも、 に置き換えremove
てremove_if
述語を使用できます。これは、さまざまな文字に一致する可能性があります。
使用できる最も単純なライブラリは、おそらくBoostStringAlgorithmsライブラリです。
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++;
}
}
}