3

C++のstd::stringからすべての句読文字を削除しようとしています。私の現在のコード:

string str_in;
string::size_type i, j;

cout << "please input string with punctuation character..." << endl;
cin >> str_in;

for (i = 0, j = 0; i != str_in.size(); ++i)
    if (!ispunct(str_in[i]))
         str_in[j++] = str_in[i];

str_in[j] = '\0';

cout << str_in << endl;

str_in[j] = '\0';間違っていますか?

4

4 に答える 4

4

str_in最初のj文字に切り捨てたい場合は、と言うことができますstr_in.resize(j)

erase-remove標準ライブラリを使用する場合は、次のようなイディオムを適用できます。

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string str_in;
    std::getline(std::cin, str_in);

    // Here is where the magic happens...
    str_in.erase(std::remove_if(str_in.begin(), str_in.end(), ::ispunct), str_in.end());

    std::cout << str_in << '\n';

    return 0;
}
于 2012-05-28T05:50:20.020 に答える
1

C ++文字列型はnullで終了するように実装されていません(ただし、c_str()呼び出しによってnullで終了する文字列得られます)。

そうstr_in[j] = '\0'です、少なくとも2つの理由で間違っています。

  1. str_in.length()句読点を削除すると、期待する文字列のサイズが反映されません。

  2. null文字は、次のような任意の出力ストリームに送信される追加のチャーターです。cout << str_in;

クラスを使用するstd::stringと、おそらく同じバッファを削除するべきではありませんが、str_out必要なものをすべてコピーした後(句読点を除く)に適切な長さのバッファを使用するかstr_in、追加する代わりに長さを調整する必要がありますnull。

于 2012-05-28T05:47:20.457 に答える
0

str_in[j] = '\0'文字列に句読点がない場合は間違っていると思います。

于 2012-05-28T05:39:35.920 に答える
0

同じ文字列を変更する代わりに、新しい文字列(たとえばstr_out)を作成し、それに追加します。

str_out += str_in[i];
于 2012-05-28T05:45:10.597 に答える