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

时间:2019-11-25 23:28:45

标签: c input int scanf c99

有人可以帮助我理解为什么第一个输入为'K'时scanf不会要求我提交第二个输入吗?

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

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

1 个答案:

答案 0 :(得分:0)

如果我们检查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()在opengroup网站上的文档

  

这些函数应返回成功匹配的数量,并且   分配的输入项; 如果数字过早,此数字可以为零   匹配失败。

输入字符值并将scanf()函数设置为mach / accept "%d"(十进制数)时,它会失败。

[评论后编辑]

如果第一个scanf()与格式规范不匹配,则输入不会被使用,而是保留在输入缓冲区中。

换句话说,不匹配的字符保留在输入缓冲区中,第二个scanf()将其用作输入,同样第二个也失败。

警告

fflush(stdin)解决了这种错误行为,但由于stdin上的fflush()导致未定义的行为,因此请勿使用。

[Edit2]

在这种情况下,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();