【发布时间】:2017-11-23 10:33:23
【问题描述】:
我在下面有一个特定示例,如果输入整数(请参阅输出 1),它工作得非常好,当我尝试在 scanf 函数调用中使用 %d 说明符扫描字符时,我得到下面的输出 2。
所以,我的问题是,如果输入一个 char,我希望类型说明符应该将其转换为等效的 int 值,如果不是垃圾值,即使在任何一种情况下它都应该打印/段错误。但是,在这里我得到了连续的打印,我觉得这是错误的,因为 scanf 每次都被绕过。我很不确定后台发生了什么,我也想知道。
#include <stdio.h>
int main()
{
int a;
while (1){
printf("enter a number:");
scanf("%d", &a);
printf("entered number is %d\n", a);
}
return 0;
}
输出 1:
> enter a number:1
> entered number is 1
> enter a number:
> 3
> entered number is 3
> enter a number:4
> entered number is 4
> enter a number:5
> entered number is 5 enter a number:
输出2:用于输入a
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
> enter a number:entered number is 32767
PS:我知道这是一个愚蠢的问题,询问在无效的情况下会发生什么,其中类型说明符意外(在这种情况下为 %d)用于不同的类型,但我想知道在后台发生了什么,如果有的话。谢谢
【问题讨论】:
-
简短的故事:如果输入与格式不匹配,则
scanf会提前返回(检查调用返回的内容!总是!)将输入留在缓冲区中。 -
在后台(实际上就在你面前,但你忽略它)scanf 告诉你它没有成功读取一个整数。返回值携带该信息。
-
"%d"需要像(white-spaces)(sign)[digits]这样的数字输入。如果用户不输入,则不会读取任何内容,并且文本会保留在stdin中以供下一个输入函数使用 - 使用您的代码,错误的输入会导致无限循环,因为有问题的文本永远不会被消耗。 -
%d 不会读取字符。为此,您需要使用 %c。
-
"if input a char" ---> 提示:“char”是指字母。在 C 中,
char是 1 字节的类型。scanf()不读取字符,而是字符。一些字符是字母、数字、标点符号、控件等。