1

だから私の質問は次のとおりです。

int n=0;
while(n<=0)
    scanf("%d",&n);

このコードは無限ループに入りますが、その理由はわかりません。ユーザーが 0 より大きい数値を入力すると、ループが停止するはずでした。

ありがとう:)

4

4 に答える 4

4

何度も何度も...

stdin(一般に)ラインバッファリングされています-<enter>端末に文字をプログラムに転送させるには、押す必要があります。そのため、バッファーにぶら下がっている改行文字がありscanf()、次の反復中にそれを読み取ろうとしますが、整数ではないため、失敗し、変数の内容は変更されません。これを解決するにscanf()は、改行を食べるようにします:

scanf("%d\n", &number);

(ああ、初期化せnずに使用することもできますが、とにかくコードがループに入るように見えるので、それは問題ではありません。ただし、初期化してください。そうしないと、他の奇妙なエラー直面します。)

于 2013-02-27T15:59:29.620 に答える
1
while (n <= 0)
    // something

は、「 の値が以下である間に何かを行う」ことを意味n0します。n条件n <= 0が評価されているときに初期化されていることを確認してください。初期化されていない変数を使用すると、未定義の動作が発生します。

やったほうがいい:

int n = 0;
while (n <= 0)
    scanf("%d\n",&n);
于 2013-02-27T15:58:14.390 に答える
0

あなたは物事を試したと主張し、それらは機能しなかったので(理由はわかりませんが)、別のことを試してみましょう。プログラマーの親友を使ってみましょう: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);

これにより、コンピューターが実行していることと、コンピューターが読み取るときに読み取る値を確認できます。コードを上記に置き換えてみて、何が起こるか見てみましょう。

于 2013-02-27T16:09:27.703 に答える
0

良い結果が得られているので、コンパイラを変更する必要があると思います。

別の場所で問題が発生している可能性があります。

ここで確認できます。

http://ideone.com/C4Yobi

コード:

#include<stdio.h>
main( )
{
int n = 0;
while (n <= 0)
    scanf("%d",&n);
printf("%d",n);
}

Input:
-5
4
Output:
4
于 2013-02-27T16:18:44.073 に答える