提交非数字后,Scanf不接受输入

bsxbgnwa  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(169)

有人能帮我理解为什么在第一次输入是“K”的情况下,scanf不会要求我提交第二次输入吗?

int n=0;
scanf("%d",&n);
scanf("%d",&n);

就像它从其他地方得到了输入,在这种情况下,n的值是多少?

ar7v8xwq

ar7v8xwq1#

如果我们检查scanf()的返回值,它显示0

#include <stdio.h>

int main(int argc, char **argv)
{
    
    int n=0;
    int retvalue=0;
    
    retvalue = scanf("%d",&n);
    printf("first scanf() return: %d\n", retvalue);
    
    retvalue = scanf("%d", &n);
    printf("seconf scanf() return: %d\n", retvalue);
    
    return 0;
}

开放集团网站上的scanf()文档
这些函数应返回成功匹配和分配的输入项的数量;在早期匹配失败的情况下,此数字可以为零。
当您输入一个字符值,并且scanf()函数设置为mach/accept "%d"(十进制数)时,它将失败。

[在注解后编辑]

如果第一个scanf()与格式规范不匹配,则不使用输入,并将其保留在输入缓冲区中。
换句话说,不匹配的字符保留在输入缓冲区中,第二个scanf()使用它作为输入,类似地,第二个也失败。

警告

fflush(stdin)解决了这类misbehavior,但不要使用因为‍‍fflush()在stdin上引起Undefined behavior。

[编辑2]

在这种情况下,getchar()调用将消耗stdin中的剩余缓冲区。

int n=0;
int retvalue=0;

retvalue = scanf("%d",&n);
printf("first scanf() return: %d\n", retvalue);

if(!retvalue)
    getchar();
    
retvalue = scanf("%d", &n);

printf("seconf scanf() return: %d\n", retvalue);

if(!retvalue)
    getchar();

相关问题