2

素因数を見つける私のプログラムはすべて設定されています...私がしなければならないことは、このタイプの出力だけです:

別の番号を試しますか?Say Y(es) or N(o): y //別の番号を要求します (プログラムをもう一度実行します)

別の番号を試しますか?Y(es) または N(o) と言ってください: n //私のプログラムをご利用いただきありがとうございます。さようなら!

以下にこれを試みます... n と入力すると、正しい出力が得られます。しかし、「y」と入力すると、n と同じことを言うだけです....この while ループ内にプログラムのコードを入れずに、プログラム全体をループするにはどうすればよいですか? y を押すと、プログラムが再び実行されますか?

int main() {
  unsigned num;
  char response;

  do{
    printf("Please enter a positive integer greater than 1 and less than 2000: ");
    scanf("%d", &num);
    if (num > 1 && num < 2000){
      printf("The distinctive prime facters are given below: \n");
      printDistinctPrimeFactors(num);
      printf("All of the prime factors are given below: \n");
      printPrimeFactors(num);
    }
    else{
      printf("Sorry that number does not fall within the given range. \n");
    }
    printf("Do you want to try another number? Say Y(es) or N(o): \n");
    response = getchar();
    getchar();
  }
  while(response == 'Y' || response == 'y');
  printf("Thank you for using my program. Goodbye!");

  return 0;
} /* main() */
4

4 に答える 4

4

問題はおそらく、条件が一致していないために、yからではないものを取得していgetcharて、ループが終了していることです。

getchar()バッファを使用する可能性があるため、「y」と入力してEnterキーを押すと、char 121(y)および10(Enter)が取得されます。

次のプログラムを試して、どのような出力が得られるかを確認してください。

#include <stdio.h>

int main(void) {
    char c = 0;

    while((c=getchar())) {
        printf("%d\n", c);
    }
    return 0;
}

次のようなものが表示されます。

$ ./getchar 
f<hit enter>
102
10

あなたが見ることができるのは、キーボード入力がバッファリングされており、次の実行でgetchar()バッファリングされた改行を取得することです。

編集:私の説明はあなたの問題に関して部分的にしか正しくありません。scanfあなたはあなたがテストしている数を読むために使用します。つまり、数字、入力、y、入力します。

scanf番号を読み取り、Enterから改行をバッファに残し、改行をresponse = getchar();読み取って改行をに格納しますresponse。次の呼び出しgetchar()(上記で説明した改行を削除するため)が取得され'y'、ループが終了します。

これは、改行を読み取ることで修正できるscanfため、バッファに残りませんscanf("%d\n", &number);

于 2013-01-31T04:24:05.603 に答える
2

scanf を使用して入力を読み取る場合 (上記の数値を入力する場合)、入力はリターン キーが押された後に読み取られますが、リターン キーによって生成された改行は scanf によって消費されません。

つまり、getchar() への最初の呼び出しは、'Y' ではない改行 (まだバッファ内にある) を返します。

getchar() への 2 つの呼び出しを逆にすると (2 番目の呼び出しが変数に割り当てたものになります)、プログラムは機能します。

printf("Do you want to try another number? Say Y(es) or N(o): \n");
getchar(); // the newline not consumed by the scanf way above 
response = getchar();
于 2013-01-31T04:37:07.963 に答える
0

他の人が述べているように、scanf()への以前の呼び出しから残っている入力ストリームには単一の「\n」文字があります。

幸い、標準ライブラリ関数fpurge(FILE * stream)は、指定されたストリームにバッファリングされた入力または出力をすべて消去します。scanf()とgetchar()の呼び出しの間に配置すると、バッファに残っているものはすべてstdinから削除されます。

fpurge(stdin);
于 2013-01-31T04:51:03.660 に答える
0

バッファから不要なものを食べるあなたの声明のgetchar()後に置くだけです...scanf'\n'

于 2013-01-31T04:27:14.090 に答える