-
scanf是一个变参函数。(参数的数量和类型不确定)
-
scanf的第一个参数是需要输入的字符串以及需要被读取的占位符。
-
scanf的后续参数,是依次被读取并赋值的变量地址。
-
占位符的类型和数量需要与后续的参数类型和数量对应。
#include <stdio.h>
int main()
{
short s;
int n;
long l;
float f;
double df;
scanf("s=%hd n=%d l=%ld f=%f df=%lf", &s, &n, &l, &f, &df);
printf("%d %d %d %f %f\n", s, n, l, f, df);
return 0;
}
注意,键盘输入的时候,必须要和scanf的第一个参数的字符串对应。也就是说,对于上面的代码输入必须是:s=1 n=2 l=3 f=4.5 df=6.7
以下几个是错误的示范
1 2 3 4.5 6.7 不一致,错误
s=1n=2l=3f=4.5df=6.7 由于scanf的第一个参数是"s=%hd n=%d l=%ld f=%f df=%lf",带有空格。 输入漏掉了空格,错误。 当然,如果scanf的第一个参数是"s=%hdn=%dl=%ldf=%fdf=%lf",那么这样就是正确的。
s=1,n=2,l=3,f=4.5,df=6.7 错误,由于scanf的第一个参数是用空格分隔的。
scanf的占位符规范和printf类似,但有些不同。请使用的时候,不要混淆了。scanf的占位符组成如下。
-
一个可选的最大字段宽度,用一个正的十进制整数表示。
-
一个可选的长度指定符。
-
必须的转换操作。
转换操作 | 长度指定符 | 参数类型 |
---|---|---|
d | hh | char * |
d | h | short int * |
d | 无 | int * |
d | l | long * |
d | ll | long long * |
u | hh | unsigned char * |
u | h | unsigned short int * |
u | 无 | unsigned int * |
u | l | unsigned long * |
u | ll | unsigned long long * |
f | 无 | float * |
f | l | double * |
f | L | long double * |
c | 无 | char * |
s | 无 | char * |
示例:
short s; scanf("%hd", &s); int n; scanf("%d", &n); long l; scanf("%ld", &l); long long ll; scanf("%lld", &ll); unsigned short us; scanf("%hu", &us); unsigned int un; scanf("%u", &un); unsigned long ul; scanf("%lu", &ul); unsigned long long ull; scanf("%llu", &ull); float f; scanf("%f", &f); double df; scanf("%lf", &df); long double ldf; scanf("%Lf", &ldf);
scanf与printf的不同
1.printf的后续参数不要加&,而scanf由于需要一个指针,所以需要加&。
2.printf的参数由于比int小的变量会升级为int,这样数据仍然是完整的。仅比int大的需要额外指明长度指示符。
3.scanf会将数据填充到对应的变量里去,必须指明被填充的对象是什么,用int来填充char很显然是错误的,所以必须明确指定长度指示符。例如%hhd用于char,%hd用于short。