c语言标准库详解(三):<stdio.h>之格式化输入
fscanf()函数
int fscanf(FILE *stream, const char *format, ...)
fscanf 函数根据格式串 format 从流 stream 中读取输入,并把转换后的值赋值给后续各个参数,其中的每个参数都必须是一个指针。当格式串 format 用完时,函数返回。如果到达文件的末尾或在转换输入前出错,该函数返回 EOF;否则,返回实际被转换并赋值的输入项的数目。
格式串format
格式串format通常包括转换说明,它用于指导对输入进行解释。格式字符串中可以包含下列项目:
- 空格或制表符
- 普通字符(%除外),它将与输入流中下一个非空白字符进行匹配
- 转换说明,由一个%、一个赋值屏蔽字符*(可选)、一个指定最大字段宽度的数(可选)、一个指定目标字段宽度的字符(h、l或L)(可选)以及一个转换字符组成。
转换说明决定了下一个输入字段的转换方式。通常结果将被保存在由对应参数指向的变量中。但是,如果转换说明中包含赋值屏蔽字符*,例如%*s,则将跳过对应的输入字段,并不进行赋值。输入字段时一个由非空白符字符组成的字符串,当遇到下一个空白符或达到最大字段宽度(如果有的话)时,对当前输入字段的读取结束。这意味着,scanf 函数可以跨越行的边界读取输入,因为换行符也是空白符(空白符包括空格、横向制表符、纵向制表符、换行符、回车符和换页符)。
转换字符表
转换字符说明了对输入字段的解释方式。对应的参数必须是指针。
如果参数是指向 short 类型而非 int 类型的指针,则在转换字符 d、i、n、o、u 和 x之前可以加上前缀 h。如果参数是指向 long 类型的指针,则在这几个转换字符前可以加上字母 l。如果参数是指向 double 类型而非 float 类型的指针,则在转换字符 e、f 和 g 前可以加上字母 l。如果参数是指向 long double 类型的指针,则在转换字符 e、f 和 g 前可以加上字母 L。
转换字符 | 输入数据 | 参数类型 |
---|---|---|
d | 十进制整数 | int * |
i | 整型数 | int * 该整型数可以是八进制(以0开头)或十六进制(以0x或0X开头) |
o | 八进制整型数(可以带或不带前导0) | int * |
u | 无符号十进制整型数 | unsigned int * |
x | 十六进制整型数(可以带或不带前导0x或0X) | int * |
c | 字符 | char * 按照字段宽度的大小把读取的字符保存到制定的数组中,不增加’\0’字段宽度的默认值为 1。在这种情况下,读取输入时将不跳过空白符。如果需要读入下一个非空白符,可以使用%1s |
s | 由空白字符组成的字符串(不包含引号) | char * 它指向一个字符数组,该字符数组必须有足够空间,以保存该字符串以及在尾部添加的’\0’字符 |
e,f,g | 浮点数 | float * float 类型浮点数的输入格式为:一个可选的正负号、一个可能包含小数点的数字串,一个可选的指数字段(字母 e 或 E 后跟一个可能带正负号的整型数) |
p | printf("%p")函数调用打印的指针值 | void * |
n | 将到目前为止该函数调用读取的字符数写入对应的参数中 | int * |
[…] | 与方括号中的字符集合匹配的输入字符中最长的非空字符串 | char * 末尾将添加’\0’。[]…]表示集合中包含字符“]” |
[^…] | 与方括号中的字符集合不匹配的输入字符中最长的非空字符串 | char * 。末尾将添加’\0’。[^]…]表示集合中不包含字符“]” |
% | 表示"%"本身,不进行赋值 |
注:
这里的倒数第二条与第三条就是正则表达式
实例代码
#include <math.h>
#include <stdio.h>
#include <time.h>
int main(){
int printCount;
int intAnimal;
double animal;
scanf("%f",&animal);
printf("Oct : %o\n",intAnimal);
printf("Hex : %x\n",intAnimal);
printf("HEX : %X\n",intAnimal);
}
scanf()函数
int scanf(const char *format, ...)
scanf(…)函数与 fscanf(stdin, …)等价。
sscanf()函数
int sscanf(const char *s,const char *format, ...)
sscanf(s, …)函数与 scanf(…)等价,所不同的是,前者的输入字符来源于字符串 s。