scanf()
函数和printf()
函数是输入/输出函数,也成为I/O函数,两者工作原理相同,都使用格式字符串和参数列表。
scanf()输入函数
scanf()
函数把输入转换成整数、浮点数、字符或者字符串,例如
scanf(%d %f", &x, &y);
其中,百分号%
开头的符号称为转换说明,%d
表示整型数据,%f
表示浮点型数据。上述代码意思是输入整数x
和浮点数y
。转换说明的个数需要与变量的个数相同,否则会出现未知错误。
注意,在读取基本变量类型时,要在变量名前加上
&
;如果读取的是字符数组,则不要加&
。&
是地址运算符,表示变量存储的地址。
使用的转换说明如下表
转换说明 | 把变量解释为 |
---|---|
%c | 字符 |
%d 或%i | 有符号十进制整数 |
%e 或%E 、%f 或%F 、%g 或%G 、%a 或%A | 浮点数 |
%o | 有符号八进制整数 |
%p | 指针(地址) |
%s | 字符串 |
%u | 无符号十进制整数 |
%x 或%X | 有符号十六进制数 |
在上述转换说明中,百分号%
和字母之间可以使用修饰符,如下表
修饰符 | 含义 |
---|---|
* | 抑制赋值 |
数字 | 最大字段宽度。达到最大宽度或遇到空白字符则停止读取 |
hh | 把整数作为signed char 或unsigned char 类型读取 |
ll | 把整数作为long long 或unsigned long long 类型读取 |
h 、l 或L | %hd 或%hi 存储为short int 类型;%ho 、%hx 和%hu 存储为unsigned short int 类型; %ld 和%li 存储为long 类型;%lo 、%lx 和%lu 存储为unsigned long 类型;%le 、%lf 和%lg 存储为double 类型;%Le 、%Lx 和%Lu 存储为long double 类型 |
j | 与整型转换说明一起使用,表示使用intmax_t 或uintmax_t 类型 |
z | 在整型转换说明一起使用,表示使用sizeof 的返回类型size_t |
t | 与整型转换说明一起使用,表示两个指针差值类型ptrdiff_t |
其中,
intmax_t
和uintmax_t
类型定义在stdint.h
的头文件中。
*
修饰符抑制赋值表示跳过相应的项,例如
scanf("%*d %*d %d", &a);
表示跳过前两个整数读取,把输入的第3个整数赋值给a
。
在scanf()
函数中,如果出现空格字符外的普通字符,则在输入时要严格匹配,例如
scanf("%d,%d", &x, &y);
必须输入一个数字,一个逗号,再一个数字,如果逗号和数字中间有空格的话也没有关系,scanf()
函数会跳过空格。实际上,除了%c
,其它的转换说明都能跳过空格,而%c
会读取空格,因此要特别注意%c
的情况。
scanf()
作为一个函数,它也有返回值,返回的是成功读取的项数。如果没有成功读取任何项,则返回0。当读取到文件尾时,返回EOF
。
printf()输出函数
printf()
函数与scanf()
函数正好相反,同样需要转换说明与变量项匹配,例如
int x = 2;
printf("%d%", x);
表示输出整型变量x
。转换说明如下表
转换说明 | 含义 |
---|---|
%a 或%A | p记数法表示的十六进制浮点数 |
%c | 单个字符 |
%d 或%i | 有符号十进制数 |
%e 或%E | e记数法表示的浮点数 |
%f | 十进制浮点数 |
%g 或%G | 自动选择%f 、%e 或%E ,%e 或%E 格式用于指数小于-4或者大于等于精度时 |
%o | 无符号八进制数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x 或%X | 无符号十六进制数,使用0f 或0F |
如果要输出单个百分号
%
,则需要连续写两个百分号%%
。
float
类型会转化为double
类型输出。
待打印的项也可以是表达式。但是,格式字符串中转换说明要与待打印的项相匹配,否则就会得到无意义的结果。
在百分号%
和字符之间插入其它字符可以修饰上述的转换说明,常见的修饰符如下表
修饰符 | 含义 |
---|---|
h | 与整型转换说明一起使用,表示short int 或unsigned short int 类型 |
hh | 与整型转换说明一起使用,表示signed char 或unsigned char 类型 |
j | 与整型转化说明一起使用,表示intmax_t 或uintmax_t 类型 |
l | 与整型转化说明一起使用,表示long int 或unsigned long int 类型 |
ll | 与整型转换说明一起使用,表示long long int 或unsigned long long int 类型 |
L | 与浮点转化说明一起使用,表示long double 类型 |
t | 与整型转换说明一起使用,表示ptrdiff_t 类型 |
z | 与整型转换类型一起使用,表示size_t 类型 |
这些修饰符还可以是数字。如果是一个整数,则表示最小字宽度,比如%4d
,表示占用4位的整数。如果实际宽度超过限定值,系统会自动使用更宽的字段。
如果是小数点.
加数字的形式,则表示精度,例如%.2f
,表示以四舍五入保留两位小数;如果用%e
或%E
转换,也表示保留小数点后的位数;如果用%g
或%G
转换,表示有效数字最大位数;如果用%s
转换,表示字符的最大数量;如果是整数,表示数字的最小位数。
上述两种方式可以结合使用,如%4.2f
,表示占用4个宽度,小数点后保留2位。
在转换说明中,也可在%
后加上标记
标记 | 含义 |
---|---|
- | 待打印项左对齐 |
+ | 显示打印有符号数字的符号。如果是整数,显示加号+ ;若为负数,显示减号- |
空格 | 若是有符号的负数,则显示减号- ;若是有符号正数,显示加号+ |
# | 转换成另一种格式。以八进制输,数字出前会显示0 ;以十六进制输出数字前会显示0x 或0X ; |
0 | 用0 填充空格。如果出现减号- ,则忽略 |
printf()
函数也有*
修饰符,可在参数列表中指定字段宽度,例如
int width = 5;
int precision = 2;
float x = 2.2;
printf("%*.*f", width, precision, x);
width
和precision
的值会替代转换说明里的*
。
最后,printf()
函数也有返回值,它返回打印字符的个数。如果输出错误,则返回负值。
字符串输入和输出
字符串除了可使用scanf()
和printf()
函数外,还有专门的输入和输出函数,详细可戳此链接。