0

重複の可能性:
これは getline() のバグですか、それとも何か間違ったことをしていますか? getline() の正しい使い方は?

STLリストと文字列でこのトピックを学ぼうとしました。統合として、私はこのプログラムを試しました:

#include<iostream>
#include<list>
#include<string>
using namespace std;

int main(){
    list<string> obj1, obj2;
    string obj;
    int n;
    cout<<"Enter the number of elements in string list 1:\t";
    cin>>n;
    cin.clear();
    cout<<"Enter the string:\n";
    for( int i=0; i<n; i++){
        getline(cin, obj);
        cout<<"The string is:\t"<<obj<<" and i is "<<i<<endl;
        obj1.push_back(obj);
    }
    obj1.sort();
    cout<<"The string in sorted order is:\n";
    list<string>::reverse_iterator rit;
    for( rit = obj1.rbegin(); rit != obj1.rend(); rit++)
        cout<<*rit<<endl;
    return 0;
}

次の出力が得られます。

Enter the number of elements in string list 1:  4
Enter the string:
The string is:   and i is 0
goat
The string is:  goat and i is 1
boat
The string is:  boat and i is 2
toad
The string is:  toad and i is 3
The string in sorted order is:
toad
goat
boat

プログラムのエラーは、最初の文字列が空白であり、リストに自動的に挿入されることです。これを回避するために、cin.clear() を使用してみましたが、エラーを克服できません。誰でもバグを特定して答えを教えてください。

4

3 に答える 3

1

同じプログラムでoperator>>使用する場合は、特別な注意が必要です。getlineoperator>>、入力ストリームに行末インジケーターを残します。これは、getline受け入れます。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')の前に追加してみてくださいgetline

于 2012-10-04T13:06:00.090 に答える
0

cin.clear()あなたが思っていることをしません。調べる。次に、ロブの回答で得たアドバイスに従います。

于 2012-10-04T13:09:09.490 に答える
0

これは、番号を入力した後、改行がまだバッファーにあるためです。そのため、最初getlineにその改行が取得されます。getline最も簡単な解決策は、ループの前にダミー呼び出しを使用することです。

于 2012-10-04T13:09:09.683 に答える