5

バグではないかもしれませんが、何が悪いのかわかりません。私の最初のエントリは、2回目の反復でstr1に対して繰り返され、それ以降も同じです。最初の反復だけがうまくいきます。

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

int main () {

cout << " \n Enter two words. \n " ;
char c = 'y';
string str;
string str1;
while (c == 'y'){

    getline(cin,str);

    getline (cin,str1);

    cout << " \n\n str : " << str << " str1 : " << str1 ;
    cout << " \n Continue ? \n " ;
    cin >> c;
}

return 0;
}

出力は次のとおりです。

2つの単語を入力してください。
 こんにちは世界
これはミスターです


 str:hello world str1:これはmrです
 継続する ?
 y
こんにちは世界


 str:str1:hello world
 継続する ?
 n


4

2 に答える 2

3

追加

cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

あなたの後

cin >> c;

次の入力を検討してください。

    dog
    cat
    y
    owl
    fish
    n

入力ストリームに存在する文字を個別に調べると、次のようになります。

    d o g \n c a t \n y \n o w l \n f i s h \n n \n

getlineを消費する最初の呼び出しdog\n; 2番目はを消費しcat\n、これを残します:

    y \n o w l \n f i s h \n n \n

の最初の呼び出しは、後続の改行cin >> cのみを消費しますが、これを残しません。y

    \n o w l \n f i s h \n n \n

さて、楽しみが始まります:次の呼び出し中に何が起こりgetlineますか?もちろん、なぜそれが次の改行まで読むのか。したがって、次の呼び出しは空の行getline返し、入力ストリームに残ります。owl...

上で概説したように、解決策は、(現在は役に立たない)入力行の残りを消費することです。

于 2012-06-21T18:56:14.450 に答える
1

ロブが言うように。

しかし、見栄えのする別の修正:

// change
char c = 'y';
....
while (c == 'y'){
....
    cin >> c;

// Into
std::string c = "y";
....
while (c == "y"){
....
    std::getline(cin, c);

手動のユーザー入力を処理する場合は、>>演算子の使用に注意する必要があります。これにより、入力に常に「\n」が残るためです。つまり、「\ n」文字を取得するメソッド(getline())を使用するか、後の単語を手動で削除する(ignore())ことができます。

于 2012-06-21T22:31:34.627 に答える