为啥scanf不能接收键盘输入,被跳过???改成C++的cin>>后便可以接收并继续下去。全部换成C++可以运行。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥scanf不能接收键盘输入,被跳过???改成C++的cin>>后便可以接收并继续下去。全部换成C++可以运行。相关的知识,希望对你有一定的参考价值。

这个问题是由于输入缓冲区内有东西引起的,这个时候scanf就会直接读入缓冲区内存在的内容,从而跳过了键盘输入。
输入缓冲区存在内容有多种原因,之前进行过输入是可能原因之一。

清空输入缓冲区最好的方法是:
int c;
while((c = getchar()) != '\n' && c != EOF);
// EOF 是 \0

除此之外VC下可以使用fflush(stdin);,不过不具备可移植性,不推荐。
更多信息可以百度。

c++中规定cout<<;输出后应当清空缓冲区,输入好像也类似吧,所以你换成C++代码就不出错了。但是注意这付出了一定性能为代价,特别是使用VC++的时候大量的cout<<操作特别慢(比gcc慢了数倍,比printf慢了更多)。
参考技术A 你是不是在scanf之前使用过scanf
因为scanf比较死板,上回你输入的如果是a回车,那么回车也是当成一个字符的。
下次scanf时,会自动先读取回车。然后后面的格式就乱了。
你在scanf之前添加一个fflush(stdin)应该就可以解决你的问题了
cin >> 的操作是自动忽略空格和换行符的输入。他就算遇到回车,也会当成没看见本回答被提问者和网友采纳
参考技术B 不是啊,在C语言中scanf的值就是从键盘上输入啊,也许你写错了吧,你可以把代码发上来,让我们看看,也许我们能够更好的帮你解决

为什么连续的scanf会被跳过或不执行

前言-

这几天再尝试学一下C语言,对着RUNOOB.com的教程一通操作,还是一脸雾水。问题倒是积累了不少。

正文-

问题一:“为啥我的第二个scanf( )函数自动跳过,不等待我输入就自己执行了?”

一个很简单的例子:

#include <stdio.h>
/*试图两次利用scanf()函数,先后读取整型变量a和字符型变量c*/
int main()
{
    int a;
    char c;
    scanf("%d",&a);
    scanf("%c",&c);
    printf("%d %c",a,c); 
}

解析:当我们输入:123 ↙
会发现程序会“直接”打印整数123,好像并没有给我们留下时间和空间输入字符型变量c的值(一开始我也一脸懵B??).
但是,经过调试(啊,万能的调试!),我们可以发现,其实整型变量c已经读入了值‘ ’,即ASCII码为10的字符——换行符;
如调试图:


技术图片

实际上:

函数scanf( )从标准输入设备(键盘) 读取输入的信息,不会直接赋值给变量,而是先储存到一个缓冲区中;

当程序执行到函数scanf()时,程序会从缓冲区中读取;
如果缓冲区是空的,才会停滞,光标闪烁,等待键盘的输入.

值得注意的是,scanf()中格式字符串里:
-对于参数%d:会忽略缓冲区开头的空白符(空格、回车、制表符等)(无论有几个);
-对于参数 %c:直接读取缓冲区的第一个字符(无论这个字符是什么);

故,上例中:
1º 向缓冲区中输入:123
2º 语句scanf("%d",&a); 读取走了123,赋给变量a;
(缓冲区变化:123 → )
3º 语句scanf("%c",&c);读取走了** ,赋给变量c**;
(缓冲区变化: → 空白)

解决方法:
1º 利用函数getchar( )吃掉回车:在scanf后接一个getchar( );

#include <stdio.h>
int main()
{
    int a;
    char c;
    scanf("%d",&a);
    getchar();/*吃掉回车*/
    scanf("%c",&c);
    printf("%d %c",a,c); 
}

2º 利用函数fflush( )清除缓冲区:如fflush(stdin);

#include <stdio.h>
int main()
{
    int a;
    char c;
    scanf("%d",&a);
    fflush(stdin);/*清除输入缓冲区*/
    scanf("%c",&c);
    printf("%d %c",a,c); 
}

注意 注意 注意 :

有同学可能用的是新版的vs,可能不支持该方法2;可以试一下替换成rewind(stdin)函数;

或者可以直接一次性读取两个数据scanf("%d%*c", &c);——注意星号*哈!
这句话的意思是就是说:读取一个整数后,丢弃紧跟在整数后边的一个字符(也就是我们多输入的“回车符”);

有问题的试一下吧…

 

问题二:“为啥在我输入数据和回车之后程序没有反应?”

——在函数scanf( )的格式字符串中加入 的问题:

#include <stdio.h>
int main()
{
    int a;
    scanf("%d
",&a);/*注意%d后的
*/
    printf("%d",a);
}

这种情况下,按照“整型数字 回车”的格式读取,读到回车之后,由于缓冲区空白,程序停滞,程序停滞,光标闪烁,等待键盘输入;故,当你输入一个整数和回车后,a的值不会立即打印,要等再接收到一个非空白符(即非空格、回车、制表符等)的输入之后,该scanf语句才结束,接着才输出。

如图:


解释:当输入:123↙ 程序框中换行但并不打印;
继续输入:456↙ 此时换行,并且输出了刚才键入的123;

总之,在使用函数scanf( )时,应该心中有一个缓冲区,合理利用相关函数来解决键盘缓冲区残余信息的问题;同时,理解读取格式,以便搞清楚何时函数scanf( )结束;


原文链接:https://blog.csdn.net/HNAKXR/java/article/details/81047391

以上是关于为啥scanf不能接收键盘输入,被跳过???改成C++的cin>>后便可以接收并继续下去。全部换成C++可以运行。的主要内容,如果未能解决你的问题,请参考以下文章

为什么连续的scanf会被跳过或不执行

为啥我的部分代码被跳过而不让我输入输入?

c语言 scanf("%d",&a);输入字符为啥会进入死循环?

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

c语言:fscanf(fp,"%*[^\n]")为啥可以跳过全部字符直到下一个换行符

C语言 gets()和scanf()函数的区别