c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么相关的知识,希望对你有一定的参考价值。

参考技术A scanf读取的是当前键盘缓冲区中的数据,而不是用户当前的输入的数据,
所以当键盘缓冲区清空的不及时的话,
会导致读入数据不正确。
在这个代码中就是由于编译系统本身对于键盘缓冲区清空的不及时,
导致scanf读入了上次输入数据时最后输入的回车,做为了本次用户输入,
可以人为的强制进行键盘缓冲区清空,来解决这个问题。
fflush(stdin);//强制进行键盘缓冲区清空语句
这么改:
char
sex,*num,*name,*birth,*add;
int
age;
printf("student
num:");
fflush(stdin);
scanf("%s",num);
printf("student
name:");
fflush(stdin);
scanf("%s",name);
printf("student
age:");
fflush(stdin);
scanf("%d",&age);
printf("student
sex:");
fflush(stdin);
scanf("%c",&sex);
printf("student
brith:");
fflush(stdin);
scanf("%s",birth);
printf("student
add:");
参考技术B 因为scanf是限定格式输入语句的函数,但是具体的问题你最好把代码发上来看看。

C语言中while语句里使用scanf的技巧

今天友人和我讨论了一段代码,是HDU的OJ上一道题目的解,代码如下

#include<stdio.h>
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        printf("%d\n",a+b);
    }
    return 0;
}

起初,我以为代码中while语句里的按位取反运算符写错了,应该是逻辑非运算符。

这时我在Quora上找到了类似的问题,我对其中一篇答案做了修改和翻译:

查阅scanf函数的man手册,关于返回值的说明如下

函数返回按照格式成功匹配并读入的输入项数量,并且可能会返回一个小于输入项总数的数字,而在匹配失败的情况下,甚至可能返回0。

如果在第一次成功读入或者发生匹配错误之前收到输入结束信号,将会返回EOF。在遇到读入错误的时候,也会返回EOF。

在上面的代码里,scanf的返回值可能是0,1,2或者EOF。

对0,1,2进行按位取反得到的都是非零值,此时while循环会继续执行。

在大多数环境里,EOF被定义为值为-1的常量,进行按位取反后得到的值为0.此时while循环将会结束。

综上所述,这个while语句可以不断从输入流读入数据,直到输入流结束,循环也就结束。

值得一提的是,这种用法仅仅在EOF被定义为-1的环境下有效,而且可读性很差。所以应该尽量避免使用它。

在Linux和OS X里,你可以通过Ctrl+D来发送一个输入结束信号,在Windows里你需要使用Ctrl+Z。

 

参考资料:

Quora上的回答

scanf(3)

以上是关于c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么的主要内容,如果未能解决你的问题,请参考以下文章

C语言中利用scanf语句输入多个值的问题

c语言:关于scanf()语句与while循环的问题

c语言将字符输入至数组为啥不执行呢

C语言scanf语句导致无法进入循环?

c语言 运行完就直接退出了,看不到结果

for里面的scanf语句不执行,赋值不成功