Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scanf没有';提交非数字后不接受输入_C_Input_Int_Scanf_C99 - Fatal编程技术网

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

有人能帮我理解为什么如果第一个输入是“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;

    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();