C/C++ IO工具

printf()scanf()

printf()格式说明符

组合格式说明符时,首先是“+”“-”等通用打印格式说明符,然后指定宽度和精度,(对于整型)接着是整型类型和整形进位制,(对于浮点型)或者是浮点数打印形式,或者是其他类型。

用整数来指定宽度;用小数点“.”开头,后接整数的方式指定精度。宽度为打印时最小字段宽度;精度对于小数打印为小数点右边的数字位数,对于科学计数法是指有效数字的最大位数,对于字符串是指打印字符的最大数目,对于整型是指打印数字的最小位数(如有必要,会用前导零填充)。只使用“.”而后不附加整数,则等价于“.0”,即“%.f”与“%.0f”相同,均不输出小数。

也可以使用程序中的整型或浮点型变量的值来指定宽度,这种情况下使用*修饰符。

通用打印形式 符号 备注
左对齐 - printf()指定宽度打印时默认右对齐
强调符号 + 非负时显示正号,负值时显示负号
保证符号位 (空格) 非负时显示前导空格,负值时显示负号
显示进制前缀 / 保证尾随零 # (对于整型)根据进制,可对应“0”、“0x”和“0X”前缀 (对于浮点型)保证至少有一位小数点
用前导零填充打印宽度 0
整型类型 符号 备注
short h
int N.A.
long l
long long ll
整型打印形式 符号 备注
有符号十进制 d 或 i
无符号十进制 u
无符号八进制 o
无符号十六进制 x 不是“h”,“h”用于表示short类型
浮点数类型 符号 备注
float N.A.
double l
long double L
浮点数打印形式 符号 备注
小数形式的浮点数 f
指数计数法的浮点数 e 或 E
指数计数的十六进制浮点数 a 或 A
自动选择计数法 g 或 G 根据浮点数值的不同自动选择计数法。
其他类型 符号 备注
char c 打印一个字符。
百分号 % 打印一个百分号。
字符串 s 打印字符串。
指针 p 打印指针。
--- --- ---
与整型结合的char hh 与整型说明符一起使用,表示signed char("%hhd")或unsigned char("%hhu")
指针的差 t 与整型说明符一起使用,如“td”
size_t z 与整型说明符一起使用,如“zd”

严谨地讲,格式说明符分为转换说明符和转换说明修饰符。转换说明修饰符可用于修饰转换说明符,修饰符不能独立充当说明符。上表的“整型打印形式”、“浮点数打印形式”以及“其他类型”的上半部分是说明符,“通用打印形式”、“整型类型”、“浮点数类型”以及“其他类型”的下半部分是修饰符。

scanf()格式说明符

读取整型 符号 备注
有符号十进制 d 或 i
无符号十进制 u
有符号八进制 o
有符号十六进制 x 或 X
--- --- ---
int N.A.
long l
long long ll
读取浮点数 符号 备注
小数形式浮点数 f
指数计数法形式浮点数 e 或 E
指数计数法形式的十六进制浮点数 a 或 A
自动判断浮点数形式 g 或 G
--- --- ---
float N.A.
double l
long double L
读取其他类型 符号 备注
字符 c
字符串 s
指针 p
转换修饰符 意义
* 滞后赋值
使用整数指定最大读取宽度 在达到最大宽度时或遇到第一个空白字符时停止读取
hh 把整数读取成signed char("%hhd")或unsigned char("%hhu")

printf()格式说明符类似,scanf()格式说明符分为“转换说明符”和“转换说明修饰符”。上表中,“读取整型”的前半部分、“读取浮点数”的前半部分和“读取其他类型”为转换说明符,“读取整型”后半部分、“读取浮点型”后半部分、“转换修饰符”部分为转换修饰符。

格式字符串中的空格表示跳过下一个输入项之前任何空格。因此 scanf("%c", &ch); 表示读取下一个字符,而 scanf(" %c", &ch); 表示读取下一个非空白字符。

printf()scanf()

返回值

printf()的返回值返回打印字符的个数;

scanf()的返回值返回成功读取项目的个数,或在遇到“文件结尾”时返回EOF。

格式字符串中的*修饰符

printf() 的格式字符串中使用*修饰符,表示打印宽度和精度有程序中整型或浮点型的变量来指定。

scanf() 的格式字符串中使用*修饰符时,将*放在%与说明符之间,表示滞后赋值。