在谭浩强那本书里面,对于输入函数的解释说明只是一些基本的用法,然而我们在日常使用中,会发生一些奇怪的现象,我们需要用更多的理论知识来解释之。
下面先列举一些奇怪的现象,如果你也出现过这样的现象,并且对其迷惑不解,那么,请继续看下去。
一、奇怪的现象
1. 奇怪现象一:
运行如下代码
#include <stdio.h>
int main() {
char a;
scanf_s("%c", &a);
printf("%d", a);
return 0;
}
结果:
我们在输入函数scanf_s("%c", &a);
的格式字符串前面加上普通字符空格:scanf_s(" %c", &a);
代码如下:
#include <stdio.h>
int main() {
char a;
scanf_s(" %c", &a);
printf("%d", a);
return 0;
}
结果如下:
这里与上面的不同之处在于这里的程序在将输入读取的时候,不能读取到换行符。
2. 奇怪现象二:
运行如下代码:
#include <stdio.h>
int main() {
int a;
scanf_s("%d", &a);
printf("%d", a);
return 0;
}
结果:
其实这个应该不觉得有什么奇怪,只是想说明一下为什么。
3. 奇怪现象三:
运行如下代码:
#include <stdio.h>
int main() {
int a;
scanf_s(" %d", &a);
printf("%d", a);
return 0;
}
结果:
按照代码中的scanf逻辑,应该要先输入空格,再输入数字的,为什么不用输入空格也可以呢?
二、解释
- 对于除开%c的转换说明(也可以理解为格式字符串)外,其它的转换说明(包括%s,实测有效)都是从第一个非空白字符开始读取的。空白字符就是换行、制表和回车符。这就解析了现象三的原因。%d的读取是从第一个非空白字符开始的,而在遇到第一个非空白字符前的所有空白字符都被scanf函数忽略了,因此输不输入空格,结果都是一样的。
- 对于现象二,scanf读取的第一个非空白字符是A,但是不符合转换说明,那么scanf在那里会停止读入,结束本次读入,并不会给变量a赋值。至于为什么输出这一串数字,而且似乎输出的数字是一样的,我也不知道为什么,有待探究。
- 对于现象一,这是%c转换说明的特殊之处。如果在转换说明前加上空格,那么%c在读取时,会从第一个非空白字符读起。