2017-07-21 14 views
0

このコードを実行すると、do-whileの外側は機能しません。cのdo-whileまたはscanf()が機能しない

が、それは私が再びプログラムを使用するためにyまたはnを入力することはできません - それは、「あなたが別の番号(Y/N)を入力しますか」

を印刷します。どこで私は間違えましたか?

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    int num, x, sqsm, psqsm; 
    char further; 
    sqsm = 0; 
    do 
    { 
     printf("Enter a natural number-"); 
     scanf("%d", &num); 
     x = num * num; 
     do 
     { 
      sqsm = sqsm + x; 
      x = (sqrt(x) - 1) * (sqrt(x) - 1); 
     } while(x > 0); 

     printf("Sum of squares of first %d natural numbers=%d\n",num,sqsm); 
     printf("Do you want to enter another number(y/n)-"); 
     fflush(stdin); 
     scanf("%c",&further); 
    } while(further == 'y'); 
} 
+2

あなたの 'printf("自然数を入力する - ");はあなたの外側 'do'の中に***でなければなりません。 –

+0

stdinの\ n文字をfflushよりもクリアする方法は他にもあります(出力ストリームでのみ使用する)。 あなたはgetcやfgetsなど何でもできます。 –

+0

@MikeNakisは役に立ちません。私は再び同じ問題に直面している。 –

答えて

2

使用

scanf(" %c",&further); 
     ^^^ 

そうでない場合は空白文字が読み込まれます。

また、未定義の動作中に、コール結果ので

fflush(stdin); 

この文を削除してください。

0

あなたはこれを見つけるだろうfflush()のドキュメントで見たい場合:

入力の場合はシーク可能なファイル(例えば、ディスクファイル、 ではなく、配管や 端子)、fflushは()破棄に関連したストリーム基底ファイルの からフェッチされているが、アプリケーションによって消費されていないバッファリングされたデータ。

実際にはfflush()は入力ストリームでは明確に定義されていますが、パイプと端末の制限があります。

この例では、fflush(stdin)を使用すると、実際には未定義の動作です(デフォルトでは、リダイレクト/変更することもできます)。この場合、stdinがターミナルストリームに添付されます。一方

、あなたが密接にあなたがこれでしょう、scanf()さんにドキュメントを見れば:

を・空白文字の列(スペース、タブ、改行、 など;参照isspace(3))。このディレクティブは、空白の任意の量に一致します。入力には、 はありません。それは実際にscanf("<a space character><your string>")が直接(ドキュメントに記載されているなど)改行文字をフラッシュ(または読み取りと無視し、正確であると)するために使用することができていると言い何

したがって、scanf(" %c", &further)%cより前のスペース)を使用すると、実際には予想される動作が生成されます。