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()
的格式字符串中使用*
修饰符时,将*
放在%与说明符之间,表示滞后赋值。