0

このプログラムは、while ループを終了するために入力として 'n' を指定したにもかかわらず、無限ループに陥ります。問題は何ですか?

#include<stdio.h>
    main()
    {        
  int num,p=0,q=0,r=0;
    char check='y';

   while(check!='n')
     {
   printf("do you want to enter a number y or n");
    scanf("%c",&check);
    getchar();
    printf("enter a number");
     scanf("%d",&num);


    if(num>0)
      p++;
       else if(num<0)
      q++;
     else 
     r++;


    }
     printf("positive=%d\t negative=%d\t zero=%d\t",p,q,r);
        }
4

3 に答える 3

1

while問題は、ループの先頭で条件が再評価されるまでループが終了しないことです。ループをこのようなものに作り直すことをお勧めします。

// we've purposely changed this to an infinite loop because
// we hop out on condition later
while(1)
{
    printf("do you want to enter a number y or n");
    scanf("%c",&check);
    getchar();

    // here's the code that will jump out of the loop early if the user
    // entered 'n'
    if('n' == check)
        break;

    // user didn't enter 'n'...they must want to enter a number
    printf("enter a number");
    scanf("%d",&num);

    if(num>0)
        p++;
    else if(num<0)
        q++;
    else 
        r++;
}
于 2013-01-30T16:41:51.583 に答える
1
while(check!='n')
{
    printf("do you want to enter a number y or n");
    scanf("%c",&check);
    getchar();
    printf("enter a number");
    scanf("%d",&num);

scanf("%d", &num);入力バッファに改行を残すため、ループの次の繰り返しで に格納されcheckます。その後、 は入力したorをgetchar()消費します。次に、バッファに残っている改行をスキップし、入力された数値をスキャンして、改行をバッファに残します。数値のスキャンと次の反復が必要かどうかのクエリの間に改行を削除する必要があります。'n''y'scanf("%d", &num);

その上で、ユーザーが を入力した直後にループを抜けた方がよい'n'ので、

while(check!='n')
{
    printf("do you want to enter a number y or n");
    scanf("%c",&check);
    if (check == 'n') {
        break;
    }
    printf("enter a number");
    scanf("%d",&num);
    getchar();  // consume newline

のほうがいい。ユーザー入力が期待と一致しない場合、それはまだ悪いことに開かれているため、堅牢なプログラムが必要な場合はscanf、変換が成功したかどうかを知るために の戻り値をチェックし、スキャンの前後に入力バッファーを完全に空にする必要があります。番号で。

于 2013-01-30T16:53:49.293 に答える
0

文字入力をチェックしていません。それがどうあるべきかは次のとおりです。

printf("do you want to enter a number y or n");
scanf("%c",&check);
/* This is what you need to add */
if (check == 'y') {
  getchar();
  printf("enter a number");
  scanf("%d",&num);
}
于 2013-01-30T16:41:13.200 に答える