17

基本的に、最初に整数を入力として取り、次にテストケースに従います。私の各テストケースは文字列です。文字列の開始パターンが「HI A」に一致し、大文字と小文字が区別されない場合、文字列を出力することを想定しています。これを達成するために、以下のコードを書きました。私の問題は、入力ごとにEnterキーを押すと、getlineが改行文字を新しい入力として受け取ることです。各入力の後に追加の getline を使用してこれに対処しようとしましたが、問題はまだ残っています。ブレーク条件を設定したにもかかわらず、プログラムがループに陥ります。私は何を間違っていますか?

#include <iostream>
#include <string>
using namespace std;
int main(){
    int N;
    cin >>N;
    string nl;
    getline(cin,nl);
    for (int i=0;i<N;i++){
        string s;
        getline(cin,s);
        //cout <<"string"<<s<<endl;
        int flag=0;
        if ((s.at(0)=='h'||s.at(0)=='H')&&(s.at(1)=='i'||s.at(1)=='I')&&(s.at(2)==' ')&&(s.at(3)=='a'||s.at(3)=='A')) flag=1;

        if (flag==1) cout << s;
        //cout << "not " <<s;
        string ne;
        cout << "i="<< i<<endl;
        if (i==N-1) {break;}
        getline(cin,ne);

    }
}

入力例は次のとおりです。

5
Hi Alex how are you doing
hI dave how are you doing
Good by Alex
hidden agenda
Alex greeted Martha by saying Hi Martha

出力は次のようになります。

Hi Alex how are you doing
4

7 に答える 7

1

getline が最後に '\n' を返すという事実を受け入れる必要があるだけです。1 つの解決策は、取得後に '\n' を削除することです。別の解決策は、追加の「endl」を書き込まないことです。たとえば、問題に対して、このコードを使用できます

int N;
cin >> N;
string line;
getline(cin, line); // skip the first new line after N.
for (int i = 0; i < N; i++) {
  string line;
  getline(cin, line);
  string first4 = line.substr(0, 4);
  // convert to upper case.
  std::transform(first4.begin(), first4.end(), first4.begin(), std::ptr_fun<int, int>(std::toupper)); // see http://en.cppreference.com/w/cpp/algorithm/transform
  if (first4 == "HI A") {
    cout << line;  // do not include "<< endl"
  }
}
于 2013-09-10T17:52:40.993 に答える