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。
参考资料:
以上是关于c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么的主要内容,如果未能解决你的问题,请参考以下文章