2011-02-08 18 views
1

私はユーザーからの入力を取得しようとしていて、s /彼が 'n'を押すまで出力します。それは動作していないようです。 scanfやcin.getの問題ですか?私がyを押すと、入力として "tekrar"が取られ、 "y"が出力として与えられ、ループに入ります。また、tekrar入力としてnを与えると停止しません。whileループでcin.get

char cevap[300]=""; 
char tekrar='y'; 
while (tekrar!='n') 
{ 
    cin.get(cevap,300); 
    cout<<cevap<<endl; 
    cout<<"Again? (y/n)"; 
    scanf("%c",&tekrar); 
} 

出力:代わりのscanfの、標準入力から読み取るため

Hello 
Again? (y/n) 
y 
Again? (y/n) 
y 
Again? (y/n) 
n 
Again? (y/n) 
n 
... 
+2

デバッガを接続すると、 'cevap'と' tekrar'の内容を見ることができます。あるいは、プログラムの実行中に簡単に値を見ることができるように、単にcout文を追加することもできます。それはcevapまたはtekrarが正しく更新されていないかどうかを伝えます。 – Tim

+1

<<とscanfを混在させると問題が発生する –

答えて

5

あなたは方法をスト​​リームに区切り文字を残しているのとそうでない認識していないのであれば危険に満ちなり、それに応じてそれらを処理することができます。

この場合、getは、改行が始まるまでの300文字の入力または入力を読み込みます。改行は抽出されないため、ストリームに残ります。つまり、scanf()への呼び出しは改行を読み取り、停止します。ちょうどストリームに入力したyまたはnのままです。

このコードを再構成して、望むようにするにはいくつかの方法があります。これは、1つの方法です:

#include <iostream> 
#include <string> 

using namespace std; 
int main() 
{ 
    string cevap; 
    char tekrar='y'; 
    while (tekrar!='n') 
    { 
     getline(cin,cevap); 
     cout<<cevap<<endl; 
     cout<<"Again? (y/n)"; 
     tekrar = cin.get(); 
     cin.ignore(); 
    } 

    return 0; 
} 

これはstd::stringを使用し、300文字に制限する必要はありませするような方法で入力を読み込むための非会員getline(厳密に質問に関連話すが、良いではありません通常は練習)。 getlineはデリミタを消費して破棄しますが、継続入力の読み取りにはgetが使用されていません。したがって、ignoreで手動で破棄します。

+0

私は 'std :: getline(cin、tekrar)'を使うとちょうどうまくいくと思うので、あなたは 'cin.get()'を使っていると思われます。 'std :: string'に変更されました)。 –

+0

私はできるだけ元のコードに少し変更を加えたいと思っていました(おそらく、getlineを使わずに済ませたはずですが、私は机を離れる必要がありました) –

3

使用CINオペレータ>>:

string cevap; 
char tekrar='y'; 
while (tekrar!='n') 
{ 
    getline(cin, cevap); 
    cout<<cevap<<endl; 
    cout<<"Again? (y/n)"; 
    cin >> tekrar; 
    cin.get(); 
} 

編集:無限ループを固定しました。単純なchar配列の代わりにstd :: stringを使うべきです。 istreamgetgetlineoperator>>)上の様々な入力方法をミキシング

+0

今回は、「y」を押すと無限ループになります。ユーザーが入力を待つことはありません(tekrar)。 –