だから私の質問は次のとおりです。
int n=0;
while(n<=0)
scanf("%d",&n);
このコードは無限ループに入りますが、その理由はわかりません。ユーザーが 0 より大きい数値を入力すると、ループが停止するはずでした。
ありがとう:)
だから私の質問は次のとおりです。
int n=0;
while(n<=0)
scanf("%d",&n);
このコードは無限ループに入りますが、その理由はわかりません。ユーザーが 0 より大きい数値を入力すると、ループが停止するはずでした。
ありがとう:)
何度も何度も...
stdin
(一般に)ラインバッファリングされています-<enter>
端末に文字をプログラムに転送させるには、押す必要があります。そのため、バッファーにぶら下がっている改行文字がありscanf()
、次の反復中にそれを読み取ろうとしますが、整数ではないため、失敗し、変数の内容は変更されません。これを解決するにscanf()
は、改行を食べるようにします:
scanf("%d\n", &number);
(ああ、初期化せn
ずに使用することもできますが、とにかくコードがループに入るように見えるので、それは問題ではありません。ただし、初期化してください。そうしないと、他の奇妙なエラーに直面します。)
while (n <= 0)
// something
は、「 の値が以下である間に何かを行う」ことを意味n
0
します。n
条件n <= 0
が評価されているときに初期化されていることを確認してください。初期化されていない変数を使用すると、未定義の動作が発生します。
やったほうがいい:
int n = 0;
while (n <= 0)
scanf("%d\n",&n);
あなたは物事を試したと主張し、それらは機能しなかったので(理由はわかりませんが)、別のことを試してみましょう。プログラマーの親友を使ってみましょう:printf
。代わりにこのコードを実行してみてはどうでしょうか。
int n = 0;
while(n <= 0)
{
printf("Please enter a number: ");
scanf("%d\n", &n);
printf("I see you entered: %d\n", n);
}
printf("Done with the loop. The value of n is: %d\n", n);
これにより、コンピューターが実行していることと、コンピューターが読み取るときに読み取る値を確認できます。コードを上記に置き換えてみて、何が起こるか見てみましょう。
良い結果が得られているので、コンパイラを変更する必要があると思います。
別の場所で問題が発生している可能性があります。
ここで確認できます。
コード:
#include<stdio.h>
main( )
{
int n = 0;
while (n <= 0)
scanf("%d",&n);
printf("%d",n);
}
Input:
-5
4
Output:
4