文章目录
本章介绍格式化输出\输入相关知识,难点是格式化输入的理解。
3.1 输出函数printf
printf函数用来输出字符串,包含了将数值类型转换为字符串的功能。printf中的f是单词format的首字母。其使用形式为
printf(格式串,表达式1,表达式2, ...);
格式串,作为函数的第一个参数,对应了将要输出的内容。如果在其中的是普通的字符,则直接输出。如果是类似%d、%f的转换说明符,说明要显示的是值,%d对应整数类型的值,%f对应浮点类型的值,而具体要输出的值放在了printf函数之后的参数中。比如,整型变量age值为10,需要输出age中的值,并且输出全文是"年龄是*岁",printf函数调用如下:
printf("年龄是%d岁\n", age);
如果要显示的是float类型变量height,则printf函数调用:
printf(“身高是%f\n”, height);
也可以显示带有运算符的表达式
printf("年龄是%d岁,下一年的年龄是%d\n", age, age + 1);
也可以在一个printf语句中显示不同类型的表达式
printf("年龄是%d岁,身高是%f\n", age, height);
printf
函数可以显示的表达式的个数是任意的,也可以没有表达式,比如我们见过的最早的程序,只显示字符串"hello, world!"
printf("hello, world!\n");
这里,要注意的问题是转换说明符和表达式的对应关系。实际上,转换说明符帮助printf函数解释二进制数值(值在内存中都是以二进制存储的),不同类型的值,其二进制数值的解释是不同的,因此转换说明符必须和表达式的数值类型相一致。
假如有如下类型变量
int age = 20;
float height = 1.7;
下面的列表给出了部分类型值的转换说明符。
表达式类型 | 输出 | 转换说明符 | 例子 |
---|---|---|---|
整数 | 整数 | d | printf("%d", age); // 输出10 |
浮点数 | 浮点数(小数形式) | f | printf("%f", height); // 输出1.700000 |
浮点数 | 浮点数 (指数形式) | e | printf("%e", height); // 输出1.700000e+000 |
浮点数 | 浮点数 (小数形式和指数形式短的那个,不显示尾随的零) | g | printf("%g", height); // 输出1.7 |
C99之前,用printf输出double类型的值时与float类型的值一样,不用要加l,直接用e、f或g,C99允许printf函数使用%le、%lf和%lg来输出double类型的值。
下图是一个printf函数的例子,printf函数的格式串指明了输出的内容:
格式串中的转换说明符用来指明输出值的类型,值的类型不同,转换说明符不同:
3.1.1 细化的转换说明
转换说明还可以对显示的字符做更精确的控制。比如,我们可以用%.1f来显示浮点数,显示的效果是小数点后面只带一位小数。更一般地,转换说明可以用%m.pX格式或者%-m.pX格式。这里的m和p都是整数常量,而X是字母。m和p都是可选的。如果省略p,m和p之间的小数点也要去掉。在转换说明%10.2f中,m是10, p是2,而X是f。在转换说明%10f中,m是10,p(连同小数点一起)省去了;而在转换说明%.2f中,p是2,m省去了。
m用来指定要显示的表达式占的最小字段宽度。 如果待显示的字符数量小于m,那么整个表达式占m个字段宽度,实际显示的字符右对齐显示。比如,转换说明%4d将以" 123"显示整数123。如果在m之前放负号,则左对齐。比如,转换说明%-4d将以"123 "显示整数123。如果待显示的字符数量大于等于m,那么忽略m值,以待显示的字符数量决定整个表达式占的字段宽度。比如,转换说明%4d将以12345的形式显示12345,不会丢失数字。
p的含义很难描述,因为它依赖转换说明符X的选择。
-
f - 表示显示“定点十进制”形式的浮点数。p指明了待显示的浮点数的小数点后显示的数字的个数(默认是6,不足补零)。如果p为0,则不显示小数点和其后的小数。
-
e - 表示显示指数形式的浮点数。p的含义与在f说明符中的一样。
-
g - 表示以“定点十进制”或者指数形式来显示浮点数。选择它们中最短的那个。p的含义是显示的有效数字的最大数量。比如,%.3g将以"1.23"显示1.2345。与f不同,它不显示尾随的零。比如,%.5f将以"1.23000"来显示1.23,而%.5g将以"1.23"来显示1.23。
-
d - 表示显示整数值。p指明了待显示的数字的最少个数