函数原型:
int scanf (const char * restrict format, ...)
1. 控制字符串和参数列表
跟printf( )一样,scanf( )使用控制字符串和参数列表。但和printf( )的区别是,printf( )函数使用变量名、变量和表达式;而scanf( )函数使用指向变量的指针。
scanf( )函数所用的转换说明字符与printf( )所使用的几乎完全相同。主要区别在于printf( )把%f、%e、%E、%g和%G同时用于float类型和double类型,而scanf( )只把它们用于float类型,而用于double类型时要求使用l修饰符。
转换说明符 | 意义 |
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e,%f,%g,%a | 把输入解释成一个浮点数(%a是C99标准) |
%E,%F,%G,%A | 把输入解释成一个浮点数(%A是C99标准) |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号八进制整数 |
%p | 把输入解释成一个指针(一个地址) |
%s | 把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符 |
%u | 把输入解释成一个无符号十进制整数 |
%x,%X | 把输入解释成一个有符号十六进制整数 |
%a,%A使用p-计数法表示浮点数:整数部分使用十六进制数表示,小数部分使用2的幂次表示。
修饰符 | 意义 |
* | 滞后赋值 |
digit(s) | 最大字段宽度:在达到最大字段宽度或者遇到第一个空白符时停止对输入项的读取 |
hh | 把整数读作signed char或unsigned char |
ll | 把整数读作long long或unsinged long long(C99) |
h,l或L |
如果没有修饰符,d、i、o和x指示int类型,而e、f和g指示float类型。 |
2. 格式字符串中的常规字符
scanf( )函数允许您把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入字符串准确匹配。例如,如果把逗号放在两个说明符之间:
scanf("%d, %d", &n, &m);
则输入必须为如下形式才会被接受:
88, 121
格式字符串中的空格意味着跳过下一个输入项之前的任何空白符(但必须要有空白符,不可以没有)。
除了%c之外的说明符会自动跳过输入项之前的空格,所以scanf("%d%d", &n, &m)与scanf("%d %d", &n, &m)的行为是相同的。
但要注意%c会读取输入中的空白符,所以scanf("%c", &n)与scanf(" %c", &n)的行为是不同的。前者会读取输入中遇到的第一个(任意)字符,后者会先跳过空白符,读取遇到的第一个非空白字符。
3. *修饰符——滞后赋值
在scanf( )中的*和在printf( )中的含义截然不同。当把它放在%和说明符字母之前时,它使函数跳过相应的输入项目。程序示例:
/* skip.c -- 跳过输入的头两个整数 */ #include <stdio.h> int main(void) { int n; printf("Please enter three integers: \n"); scanf("%*d %*d %d", &n); printf("The last integer was %d\n", n); return 0; }
输入:2004 2005 2006
输出:2006
4. 返回值
scanf( )函数返回成功读入的项目的个数。如果它没有读取任何项目,会返回值0。当它检测到“文件结尾”时,会返回EOF。