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);

这不是整个程序。在这段代码之后,有一个检查来验证用户是否猜到了年份。

如您所见,用户永远猜不到答案,因为有符号字符只接受从 -128 到 127 的输入。这是故意的。

这个程序的问题在于,如果用户输入了超出字符范围的数字,程序就会立即退出。程序的行为就像最后没有 getchar() 一样,即使有。请问我该如何解决这个问题?

编辑

如果输入超出范围,则程序的行为类似于用户忘记在末尾包含 getchar() 的应用程序。

4

1 回答 1

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

只从输入流中获取一个字符,因此如果用户输入年份,例如 1952,则在将“1”分配给answer(952 和“\n”)之后,输入流中还有 4 个字符。

所以除非你getchar()最后有足够的 s ,否则有足够的剩余输入来立即满足它们。

如果要将 123 形式的输入转换为 a signed char,则应使用%hhd格式,

scanf("%hhd", &answer);

scanf不检查溢出,因此输入超出范围的值会导致未定义的行为(有符号整数溢出)。要获得溢出控制,您应该将一行(或其中的一部分)读入缓冲区,

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

并手动解析输入。不幸的是, 没有标准转换strtoxysigned char因此您应该使用strtol将输入转换为 a long,然后检查超出范围的值。

于 2012-10-25T14:04:18.080 回答