输入超出范围的char号时,程序立即退出

时间:2012-10-25 14:01:24

标签: c integer char exit

我有一个用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()的应用程序。

1 个答案:

答案 0 :(得分:7)

scanf("%c", &answer);

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

因此,除非你在结尾有足够的getchar(),否则有足够的剩余输入来立即满足它们。

如果您希望将表单123的输入转换为signed char,则应使用%hhd格式,

scanf("%hhd", &answer);

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

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

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