2010-11-22 20 views
3

私はscanfを使いこなそうとしているときに困っています。私はプログラムを終了したらそれを置くと2回の読み込みが必要です。それは宿題であり、それらの場所でそれらの関数を使わなければなりません。なぜscanfで問題が発生していますか?

コード:あなたの最初のscanf()は、入力バッファ(物事を区切る空白の任意の形式、通常リターン)としたときに、次の呼び出しに残るデータがまだあるということです後

int main() 
{ 
    int i=0,operation=0; 
    char str[100]; 

    printMenu(); 

    scanf("%d",&operation); 

    switch (operation) 
    { 
     case 1:  
      printf("Please, enter your sentence >"); 
      gets(str); 
      gets(str); 

      if (checkChars(str)) 
       inputSent(str); 
      else 
       printf("ERROR: Incorrect data, try again."); 

      break; 
    } 

    return 0; 
} 
+2

何が多分 'gets'使用して間違って行くだろうか? – icecrime

+0

CheckChars()またはinputSent()で問題が発生していませんか? – GreenMatt

答えて

0

何が起こっているのですgets()数字を入力した後にヒットした「Enter」を読み込んだのですぐに戻ります。 これを解決するには、入力バッファをフラッシュする必要があります。これは、特に、個々の文字の単語と文章の読み間を切り替えるときの良い練習です。ここで私はあなたを助けるかもしれない別のスレッドから見つかった小さなスニペットがあります(これはあなたのscanf()後に行くだろう):

while (getchar() != EOF);
何それは何も残っていないまで継続的に入力バッファから文字を読み込まれません。これはすべての状況に最適なソリューションではないかもしれませんが、この課題を解決するのに十分なはずです。

+1

'while(getchar()!= '\ n');'ここで必要な部分に少し近づくでしょうか? –

1

したがって、データの標準ストリームがあります。これは、端末で書き込む入力です。

scanfに電話すると、書き込んだ10進数のみが読み取られます。それはそれの後に改行を読みません。したがって、getsへの2回の呼び出しが必要です。最初の呼び出しでは'\n'が表示され、2番目の呼び出しでは実際のデータが表示されるためです。

これを修正するには、操作を取得したときにgetを使用して完全な行を読み込み、sscanfを使用して操作を取得することをお勧めします。例えば

printMenu(); 

gets(str) 
sscanf(str, "%d", &operation); 

switch (operation) { 
関連する問題