0

この行を使用する誰かのコードを変更しようとしています:

out.write(&vecBuffer[0], x.length());

ただし、出力したくない悪い文字を削除するように、事前にバッファーを変更したいと思います。たとえば、バッファが「Test%string」で % を取り除きたい場合、バッファを「Test string」または「Teststring」のどちらか簡単な方に変更します。

4

5 に答える 5

3

std::replace特定の文字を別の文字に置き換えることができ'%'ます' '。普通に呼び出すだけです:

std::replace( vecBuffer.begin(), vecBuffer.end(), '%', ' ' );

'%'を述語オブジェクト callにreplace_if置き換えると、述語オブジェクトが を返す任意の文字を置き換えることができますtrue。でもいつも同じキャラ。柔軟性を高めるために、を受け取り、 を返すstd::transform関数を渡す があります。バッファ内の各文字で呼び出されます。charchar

または、次のようなこともできます。

vecBuffer.erase(
    std::remove( vecBuffer.begin(), vecBuffer.end(), '%' ).
    vecBuffer.end() );

文字を削除するには。ここでも、 に置き換えremoveremove_if述語を使用できます。これは、さまざまな文字に一致する可能性があります。

于 2013-02-07T16:33:17.447 に答える
2

使用できる最も単純なライブラリは、おそらくBoostStringAlgorithmsライブラリです。

boost::replace_all(buffer, "%", "");

のすべての発生を適切な場所で何も置き換え%ません。" "代わりに、または必要に応じて指定することもできます"REPLACEMENT"

于 2013-02-07T16:25:36.530 に答える
1
std::string str("Test string");
std::replace_if(str.begin(), str.end(), boost::is_any_of(" "), '');
std::cout << str << '\n';
于 2013-02-07T16:30:31.253 に答える
0

boost ライブラリを使用する必要はありません。最も簡単な方法は、ヘッダー%から std::replace() を使用して、文字をスペースに置き換えることです。<algorithm>

std::replace(vecBuffer.begin(), vecBuffer.end(), '%', ' ');

vecBufferその名前が示すように、 は std::vector であると仮定します。それが実際に単純な配列 (またはポインター) である場合は、次のようにします。

std::replace(vecBuffer, vecBuffer + SIZE_OF_BUFFER, '%', ' ');

SIZE_OF_BUFFER は、配列のサイズ (または、バッファ全体を変換したくない場合は、処理する配列内の文字数) にする必要があります。

于 2013-02-07T16:27:40.343 に答える
-1

あなたが機能を持っていると仮定して

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++;
        }
    }
}
于 2013-02-07T16:26:50.493 に答える