Mat*_*hew 1 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);
Run Code Online (Sandbox Code Playgroud)
这不是整个计划.在此代码之后,有一个检查,用于验证用户是否猜到了年份.
正如您所看到的,用户永远无法猜出答案,因为签名的char只接受-128到127的输入.这是故意的.
这个程序的问题是如果用户输入一个字符范围之外的数字,程序就会立即退出.该程序的行为就好像最后没有getchar(),即使有.我该如何解决这个问题?
编辑
如果输入超出范围,则程序的行为类似于用户忘记在最后包含getchar()的应用程序.
scanf("%c", &answer);
Run Code Online (Sandbox Code Playgroud)
从输入流中只接收一个字符,因此如果用户输入年份,例如1952,则在将'1'分配给answer(952和'\n')之后输入流中仍有4个字符.
因此,除非你getchar()在最后有足够的s,否则有足够的剩余输入来立即满足它们.
如果要将表单123的输入转换为a signed char,则应使用%hhd格式,
scanf("%hhd", &answer);
Run Code Online (Sandbox Code Playgroud)
但是scanf不检查溢出,因此输入超出范围的值会导致未定义的行为(有符号整数溢出).要获得溢出控制,您应该将一行(或一部分)读入缓冲区,
char buf[30];
fgets(buf, sizeof buf, stdin);
Run Code Online (Sandbox Code Playgroud)
并手动解析输入.不幸的是,没有标准的转换strtoxy对signed char,所以你应该使用strtol的输入转换为一个long,然后检查超出范围的值.