1

C で書かれたプログラムがあります。以下はプログラムのスニペットです。

signed char answer;

printf("----Technology Quiz----\n\n");
printf("The IPad came out in which year?\n");
printf("Year: ");
scanf("%c", &answer);
printf("\n\n");
printf("The answer you provided was: %c\n\n", answer);

これはプログラム全体ではありません。このコードの後に​​、ユーザーが年を推測したかどうかを検証するチェックがあります。

ご覧のとおり、signed char は -128 から 127 までの入力しか受け付けないため、ユーザーが答えを推測することはできません。これは意図的なものです。

このプログラムの問題点は、ユーザーが文字の範囲外の数字を入力すると、プログラムがただちに終了することです。プログラムは、最後に getchar() があっても、あたかも存在しないかのように動作します。どうすればこの問題を解決できますか?

編集

入力が範囲外の場合、プログラムは、ユーザーが最後に getchar() を含めるのを忘れたアプリケーションのように動作します。

4

1 に答える 1

7
scanf("%c", &answer);

は入力ストリームから 1 文字しか取得しないため、ユーザーが年を 1952 などと入力すると、入力ストリームには '1' が割り当てられた後に 4 文字answer(952 と '\n') が残ります。

したがってgetchar()、最後に十分な s がない限り、それらをすぐに満たすのに十分な入力が残っています。

フォーム 123 の入力を に変換する場合は、次の形式signed charを使用する必要があります。%hhd

scanf("%hhd", &answer);

ただしscanf、オーバーフローはチェックしないため、範囲外の値を入力すると、未定義の動作 (符号付き整数のオーバーフロー) が発生します。オーバーフロー制御を取得するには、行 (または行の一部) をバッファーに読み込む必要があります。

char buf[30];
fgets(buf, sizeof buf, stdin);

入力を手動で解析します。残念ながら、 には標準の変換がないstrtoxyためsigned char、 を使用strtolして入力を に変換し、long範囲外の値をチェックする必要があります。

于 2012-10-25T14:04:18.080 に答える