0

だから、ここに私のコードがあります。指定されたテキストからすべての 'a' と 'A' を削除する必要があります (これはランダムである可能性があります) が、与えられたテキスト ブロックのサンプルは次のとおりです。

素早い茶色のキツネが怠け者の犬を飛び越えます。曲がり角にきつねがやってくると、ねこが逃げていきました。さらに進んだところで、学生が CS2433 クラスの試験を受けていました。

途中で何が起こっているのかを確認するために、他のいくつかの cout を追加しました。私の cin は、指定されたテキストの "The" 部分のみを読み取っているようです。

何が起こっているのかわかりませんか?入力ファイルでファイルを実行するために使用する UNIX コマンドは次のとおりです。

1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4
5 int main()
6 {
7
8    string str;
9    cin >> str;
10
11    char chars[] = "aA";
12    cout << str;
13    for (unsigned int i = 0; i < str.length(); i++)
14    {
15 
16
17       str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
18    }
19    cout << str;
20    for (int i = 0; i < str.length();i++)
21    {
22       if (str[i] == '\n')
23       {
24          str[i] = '\t';
25       }
26    }
27
28 
29    cout << str;
30
31 }

更新: 各反復を変数 "text" に連結する getLine コマンドを使用して while ルックを書き出し、元のコードの一部を実行して、すべての str をテキストに置き換えました。回答に感謝します。投稿されたリポジトリを確実に調べます。ありがとう!

4

4 に答える 4

4

>>ブランクに到達すると停止します。多分あなたはstd::getline代わりに欲しいですか?

std::getline(std::cin, str);
于 2012-10-11T03:15:15.840 に答える
1

@cnicutar の回答を拡張すると、次のように から読み取る標準的な方法になりますstd::cin

std::string str;
while (std::getline(std::cin, str))
{
    // str now contains text upto the first newline
}

しかし、'a' と 'A' をすべて削除する場合は、入力ストリームを一度に 1 文字ずつ反復処理することをお勧めします。

std::cin >> std::noskipws; // Do not skip whitespaces in the input stream

std::istream_iterator<char> it(std::cin);
std::istream_iterator<char> end;

std::string result;

// Copy all characters except {'a', 'A') to result
std::copy_if(it, end, std::back_inserter(result),
                [](char c) -> bool { return c != 'a' && c != 'A'; }
                );
于 2012-10-11T03:30:06.287 に答える
0

これは短く、かなり単純です。std::stringこれは、入力ストリームと一般的な消去-削除イディオムからを構築する1つの方法を示しています。

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

bool is_aorA(char ch)
{
    return ch == 'a' || ch == 'A';
}

int main()
{
    std::istreambuf_iterator<char> input(std::cin), end;
    std::string str(input, end);

    str.erase(std::remove_if(str.begin(), str.end(), is_aorA), str.end());

    std::cout << str << '\n';
}

ideone.comで実際の動作をご覧ください

于 2012-10-11T03:54:01.897 に答える
0

@cnicutar からの回答を拡張し、コード内の他のいくつかのものを修正するには:

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

int main()
{
    char* to_remove = "aA";

    while (!std::cin.eof())
    {
        std::string str;
        std::getline(std::cin, str);

        if (std::cin.fail())
        {
            std::cerr << "Error reading from STDIN" << std::endl;
            return 1;
        }


        size_t index = 0;

        while ((index = str.find_first_of(to_remove, index)) != string::npos)
        {
            str.erase(index);
        }

        std::cout << str << std::endl;
    }

    return 0;
}
于 2012-10-11T03:28:45.310 に答える