我有一个用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()的应用程序。
答案 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
,然后检查超出范围的值