Scanf没有';提交非数字后不接受输入
有人能帮我理解为什么如果第一个输入是“K”,那么scanf不会要求我提交第二个输入Scanf没有';提交非数字后不接受输入,c,input,int,scanf,c99,C,Input,Int,Scanf,C99,有人能帮我理解为什么如果第一个输入是“K”,那么scanf不会要求我提交第二个输入 int n=0; scanf("%d",&n); scanf("%d",&n); 就好像它从其他地方得到了输入一样!在这种情况下,n的值是多少?如果我们选中scanf()返回值,则其显示为0 #include <stdio.h> int main(int argc, char **argv) { int n=0; int retvalue=0; retv
int n=0;
scanf("%d",&n);
scanf("%d",&n);
就好像它从其他地方得到了输入一样!在这种情况下,n的值是多少?如果我们选中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
成功匹配。未匹配的输入保留在流中,与未匹配说明符关联的变量不会更改。这就是为什么scanf()
返回一个值,告诉您是否成功。这也是为什么使用scanf()
读取输入是一个非常糟糕的主意-如果输入不是预期的,您的输入流将处于不确定状态。我怀疑。请有人帮助我理解为什么。。。因为scanf
是一个设计非常糟糕、几乎无用的函数。我鼓励所有的C程序员要么根本不使用它,要么在最初的几周里把它用于非常简单的事情,然后毕业到更好的地方。在你使用它的最初几周,只给它完美的输入;当输入不匹配时,甚至不要试图弄清楚它会做什么(更不用说让它表现得更优雅了)。@SteveSummit,你能说明哪些函数比scanf()
更适合使用吗?我想OP理解第一个scanf
失败的原因。根本的问题是,为什么第二个scanf
在没有提示用户的情况下也会失败。“stdin上的fflush()导致未定义的行为”与“fflush(stdin)解决此类错误行为”相矛盾。正确的说法是,fflush(stdin)
是由Microsofts“C”实现(比如它是)定义的,用于从输入流中删除已接收但未处理的字符,但不是由C标准定义的,因此不能用于可移植行为。无论如何,建议人们使用fflush(stdin)
是个坏主意,因为它不可移植。在每次失败后执行scanf
,然后重试scanf
,可以通过执行getchar()
(并测试EOF)来丢弃不需要的输入。谢谢,@EricPostpischil相关评论:我不认为丢弃输入缓冲区通常是错误的。如果确定用户键入了不可接受的内容,可以放弃他们当前键入的所有内容,将问题告知他们,然后请求新的输入。@Esmaele是的,通常放弃输入是错误的。通常这意味着您使用的是scanf
,而它在错误输入上“卡住”。但是,严肃地说:解决这个问题的正确方法是首先不要使用scanf
scanf
是一个非常糟糕的功能。对于“玩具”程序和完美的输入来说,它可能还不够,但试图处理好错误的输入是它基本上无法做到的许多事情之一。(你可以尝试,但你总是会得到不令人满意的结果,这简直是多此一举。)
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();