在c语言中,初学者经常会遇见 scanf 读取空白字符(回车,空格)等问题,解决的办法就是在 scanf 读取前用 getchar( ) 函数把缓存区的空白字符读取掉,当然,你也可以用 scanf 读取
下面,我们来探讨一下 scanf 函数的读取原理:
大致来说,原理是这样的:用户在键盘上输入字符,这些字符会被存入一个叫缓存区的地方,然后 scanf 根据占位符去挨个读取缓存区的字符。而每当我们输入完成后,总会按下回车键,而这个回车键也是一个空白字符(简单点说,回车是个字符),然后 scanf 一不小心就把回车给读取了。解决的办法就是用一个函数把这个回车给读取掉,比如 getchar 和 scanf。
但是秉着刨根问底的精神,我觉得有必要探讨一下什么时候 scanf 会不听话的读取回车,先来看看以下代码:
int n = 0, m = 0;
char x = 0;
scanf("%d" , &n);
scanf("%d", &m);
scanf("%c" , &x);
可以看到,只有 3 后面的回车被读取了,而两个整型的读取没有任何影响,所以,这是因为占位符是%c ,还是 x 的类型为char?
接着看把 m 的类型换成 char:
int n = 0;
char m = 0;
char x = 0;
scanf("%d" , &n);
scanf("%d", &m);
scanf("%c" , &x);
可以很明显的看到,还是只有3 后面的回车被读取了,而 m 存放了‘x3’,盲猜是个字符
下来把 m 的占位符换成%c :
int n = 0;
int m = 0;
char x = 0;
scanf("%d" , &n);
scanf("%c", &m);
scanf("%c" , &x);
可以看到,回车被读取了,并且被存放成整型10,由以上推断,scanf 读取空白字符的情况取决于 占位符%c ,与字符类型无关。
那么%s 能行吗?
试试:
int n = 0;
int m = 0;
char x = 0;
scanf("%d" , &n);
scanf("%s", &m);
scanf("%c" , &x);
可一看到 %s 好像对回车不感兴趣。。。。
总结: scanf 读取空白字符的情况只与 占位符 %c 有关。