代码
3.1 tprintf.c
程序 用printf 函数格式化数
下面的程序举例说明了用printf 函数以各种格式显示整数和浮点数的方法。
/* Prints int and float values in various formats */
#include <stdio.h>
int main(void)
{
int i;
float x;
i = 40;
x = 839.21f;
printf("|%d|%5d|%-5d|%5.3d|\n", i, i, i, i);
printf("|%10.3f|%10.3e|%-10g|\n", x, x, x);
return 0;
}
在显示时,printf 函数格式串中的字符| 只是用来帮助显示每个数所占用的空格数量;不同于% 或\ ,字符| 对printf 函数而言没有任何特殊意义。此程序的输出如下:
|40| 40|40 | 040|
| 839.210| 8.392e+02|839.21 |
下面仔细看一下上述程序中使用的转换说明。
%d ——以十进制形式显示变量i ,且占用最少的空间。
%5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为变量i 只占两个字符,所以添加了3个空格。
%-5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为表示变量i 的值不需要用满5个字符,所以在后续位置上添加空格(更确切地说,变量i 在长度为5的字段内是左对齐的)。
%5.3d ——以十进制形式显示变量i ,且至少占用5个字符的空间并至少有3位数字。因为变量i 只有2个字符长度,所以要添加一个额外的零来保证有3位数字。现在只有3个字符长度,为了保证占有5个字符,还要添加2个空格(变量i 是右对齐的)。
%10.3f ——以定点十进制形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 只需要7个字符(即小数点前3位,小数点后3位,再加上小数点本身1位),所以在变量x 前面有3个空格。
%10.3e ——以指数形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 总共需要9个字符(包括指数),所以在变量x 前面有1个空格。
%-10g ——既可以以定点十进制形式显示变量x ,也可以以指数形式显示变量x ,且总共用10个字符。在这种情况下,printf 函数选择用定点十进制形式显示变量x 。负号的出现强制进行左对齐,所以有4个空格跟在变量x 后面。
3.2 addfrac.c
程序 分数相加
为了显示scanf 函数的模式匹配能力,考虑读入由用户键入的分数。分数通常的形式为分子/分母 。scanf 函数允许读入整个分数,而不用将分子和分母视为两个整数分别读入。下面的分数相加程序体现了这一方法。
/* Adds two fractions*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int num1, denom1, num2, denom2, result_num, result_denom;
printf("Enter first fraction: ");
scanf("%d/%d", &num1, &denom1);
printf("Enter second fraction: ");
scanf("%d/%d", &num2, &denom2);
result_num = num1 * denom2 + num2 * denom1;
result_denom = denom1 * denom2;
printf("The sum is %d/%d\n", result_num, result_denom);
return 0;
}
注意,结果并没有化为最简分数
练习题
- 下面的printf 函数调用产生的输出分别是什么?
(a) printf("%6d,%4d", 86, 1040);
(b) printf("%12.5e", 30.253);
(c) printf("%.4f", 83.162)