printf与scanf先后执行的问题
先提一下 scanf遇到空格符 回车符是会自动忽略的 并放在缓冲区。遇到回车符会停止scanf的读取的。值得一提的是scanf在读取%c字符时还是会读取空白符也就是空格符,其他时候都是默认跳过空白符直到遇到非空白符进行读取。
第一个例子
#include <stdio.h>
int main(void){
char m[40];
char n;
printf(“please input first str:\n”);
scanf("%s",m);//读取第一个字符串
printf("you input str is :%s\n",m);
printf("input second char :\n");
scanf("%c",&n); //获取第二个字符
printf("now you input second char is :%c\n",n);
return 0;
}
输出结果:
显然 与我们预期不符, printf跟scanf在一起的时候就是这样,其实我也搞不懂,不是先运行printf,而是一直卡在scanf上,难道是在编译和汇编成机器语言的时候反过来了? 解决方案就是在他们之间加一句fflush(stdout);即可先打印出结果。
#include <stdio.h>
int main(void){
char m[40];
char n,c;
printf(“please input first str:\n”);
fflush(stdout);
scanf("%s",m);//读取第一个字符串
printf("you input str is :%s\n",m);
printf("input second char :\n");
fflush(stdout);
scanf("%c",&n);
printf("now you input second char is :%c\n",n);
return 0;
}
很可惜还是跟预期不符,就是因为scanf会自动读取缓冲区内的数据,而且我们前面有一个scanf函数,会把空白符跟换行符忽略并放入缓冲区,到了第二个scanf函数就会执行,而scanf遇到换行符就会停止,所以就会导致成这种结果,所以我们最好清除掉缓冲区内的数据,在第一个scanf读取完毕后,记得用清除缓冲区函数把未读取的空白符和换行符丢掉,可以用getchar也可以用setbuf(stdin, NULL);函数,都可以
#include <stdio.h>
int main(void){
char m[40];
char n,c;
printf(“please input first str:\n”);
fflush(stdout);
scanf("%s",m);//读取第一个字符串
setbuf(stdin, NULL);
printf(“you input str is :%s\n”,m);
printf(“input second char :\n”);
fflush(stdout);
scanf("%c",&n);
printf(“now you input second char is :%c\n”,n);
return 0;
}
跟预期的相符了
以上若有解释不恰当,望评论斧正 谢谢