3

次のコードをEclipseで実行しようとしていますが、プログラムを停止するまでコンソールは空白のままになり、その時点で「次の値を入力してください(<=0 to quit)2130567168分は35509452時間48分です。」という出力が表示されます。何度も繰り返されます。

何らかの理由で scanf がデフォルト値を設定しているようです...理由がわかりません。プログラムが停止する前に何も表示されないので、printfがフラッシュされていないことが関係しているのではないかと思いましたが、\nを使用してフラッシュを強制しました。

何か案は?

#include <stdio.h>
const int MIN_PER_HOUR = 60;  // minutes per hour

int main(void)
{
 int hour, min, left;

 printf("Convert minutes to hours and minutes!\n");
 printf("Enter the number of minutes (<=0 to Quit):\n");

 scanf("%d", &min);    // read number of minutes

 while(min > 0){
  hour = min / MIN_PER_HOUR; // truncated number of hours
  left = min % MIN_PER_HOUR; // number of minutes left over

  printf("%d minutes is %d hours, %d minutes.\n", min, hour, left);

  printf("Enter next value (<=0 to quit)");
  scanf("%d", &min);
 }
 printf("Done!\n");

 return 0;
}
4

5 に答える 5

3

Eclipse のターミナル エミュレータは異なる場合があり、より多くのバッファリングを行います。fflush(stdout);プリントアウトと への呼び出しの間に呼び出してみてくださいscanf()

于 2009-12-13T18:18:35.913 に答える
1

コードをビジュアル C++ に移動したところ、期待どおりに動作します。私の質問は、「Eclipse の端末エミュレーションが壊れているのはなぜですか?」ということだったはずです。

于 2009-12-13T18:27:14.613 に答える
1

の入力に整数を表すのに無効な文字がある場合scanf()、関数はその文字で停止し、バッファに残して、何度も何度も読み取れるようにします...

最初に「14 分」と入力したとしますscanf()。関数は「14」を読み取り、スペースで停止します。次に、変数minに 14 を割り当て、プログラムを続行します。

次に、ループ内で、プログラムは別の を実行しscanf()ます。今回は、入力バッファにはすでに内容が含まれています。つまり、「分」とスペースがあります。scanf()スペースを読み取って無視し、整数に変換できない「m」を見つけて、変数に新しい値を割り当てずに値を返すことなく停止minます0。そしてまた…そしてまた…そしてまた。

したがって、あなたがしなければならないことは、毎回の後に入力バッファをクリアすることですscanf().

どのくらいクリアできますか?
おそらく ENTER まで - これはほぼ同じですfgets():)
例:

int ch;
scanf("%d", &min);
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */
于 2009-12-13T22:29:00.870 に答える
1

問題: コードを実行するとコンソールが空白になり、再度実行しようとするとエラーが発生します。

回答: まず、タスク マネージャーを開き (Alt + Ctrl + Delete キーを押します)、詳細に移動します (Windows 10 の場合)。リストでファイルを見つけ、そのファイルを右クリックして [タスクの終了] をクリックします。

次に、fflush(stdout);every printfandscanfステートメントの間で使用します。

例えば:

printf("Enter number 1");
fflush(stdout);
scanf("%d",&a);
printf("Enter number 2");
flush(stdout);
scanf("%d",&b);
于 2020-06-19T13:04:00.553 に答える