scanf_s被跳过不执行?
原因: 函数scanf()从键盘读取输入的信息,不会直接赋值给变量。而是先储存到一个缓冲区中。当程序执行到scanf_s时,程序会从缓冲区中读取。如果缓冲区是空的,才会停滞,光标闪烁,等待键盘输入。
注意:
对于参数%d:会忽略缓冲区开头的空白符(空格、回车、制表符等)(无论有几个);
-对于参数 %c:直接读取缓冲区的第一个字符(无论这个字符是什么);
故,上例中:
1º 向缓冲区中输入:123\n
2º 语句scanf("%d",&a); 读取走了123,赋给变量a;
(缓冲区变化:123\n → \n)
3º 语句scanf("%c",&c);读取走了**\n,赋给变量c**;
(缓冲区变化:\n → 空白)
解决方法:
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);
}
1
2
3
4
5
6
7
8
9
10
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);
}
1
2
3
4
5
6
7
8
9
10
注意 注意 注意 :
有同学可能用的是新版的vs,可能不支持该方法2;可以试一下替换成rewind(stdin)函数;
或者可以直接一次性读取两个数据scanf("%d%*c", &c);——注意星号*哈!
这句话的意思是就是说:读取一个整数后,丢弃紧跟在整数后边的一个字符(也就是我们多输入的“回车符”);
有问题的试一下吧…
问题二:“为啥在我输入数据和回车之后程序没有反应?”
——在函数scanf( )的格式字符串中加入\n的问题:
例如:
#include <stdio.h>
int main()
{
int a;
scanf("%d\n",&a);/*注意%d后的\n*/
printf("%d",a);
}
1
2
3
4
5
6
7
这种情况下,按照“整型数字 回车”的格式读取,读到回车之后,由于缓冲区空白,程序停滞,程序停滞,光标闪烁,等待键盘输入;故,当你输入一个整数和回车后,a的值不会立即打印,要等再接收到一个非空白符(即非空格、回车、制表符等)的输入之后,该scanf语句才结束,接着才输出。
浙公网安备 33010602011771号