有人能帮我理解为什么在第一次输入是“K”的情况下,scanf不会要求我提交第二次输入吗?
int n=0; scanf("%d",&n); scanf("%d",&n);
就像它从其他地方得到了输入,在这种情况下,n的值是多少?
ar7v8xwq1#
如果我们检查scanf()的返回值,它显示0
scanf()
#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"(十进制数)时,它将失败。
"%d"
[在注解后编辑]
如果第一个scanf()与格式规范不匹配,则不使用输入,并将其保留在输入缓冲区中。换句话说,不匹配的字符保留在输入缓冲区中,第二个scanf()使用它作为输入,类似地,第二个也失败。
警告
fflush(stdin)解决了这类misbehavior,但不要使用因为fflush()在stdin上引起Undefined behavior。
fflush(stdin)
fflush()
[编辑2]
在这种情况下,getchar()调用将消耗stdin中的剩余缓冲区。
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();
1条答案
按热度按时间ar7v8xwq1#
如果我们检查
scanf()
的返回值,它显示0开放集团网站上的scanf()文档
这些函数应返回成功匹配和分配的输入项的数量;在早期匹配失败的情况下,此数字可以为零。
当您输入一个字符值,并且
scanf()
函数设置为mach/accept"%d"
(十进制数)时,它将失败。[在注解后编辑]
如果第一个
scanf()
与格式规范不匹配,则不使用输入,并将其保留在输入缓冲区中。换句话说,不匹配的字符保留在输入缓冲区中,第二个
scanf()
使用它作为输入,类似地,第二个也失败。警告
fflush(stdin)
解决了这类misbehavior,但不要使用因为fflush()
在stdin上引起Undefined behavior。[编辑2]
在这种情况下,
getchar()
调用将消耗stdin
中的剩余缓冲区。