一、问题
printf()函数对输出格式到底该如何控制呢?
二、解答
对不同类型的数据⽤不同的格式字符串,其中常⽤的有以下⼏种格式字符。
1、格式字符d
格式字符d⽤于输出⼗进制整数。有以下⼏种⽤法:
(1)%d
按整型数据的实际长度输出。
(2)%md
m 为指定的输出字段的宽度。如果数据的位数⼩于m,则左端补以空格;若⼤于 m,则按实际位数输出。
(3)%ld
输出长整型数据。
cpp
#include <stdio.h>
int main()
{
int i, k;
long j;
i = 12;
j = 34567;
k = 789;
printf("%d,%d\n", i, k);
printf("%4d,%2d\n", i, k);
printf("%ld\n", j);
return 0;
}
输出结果如下
cpp
12,789
12,789
34567
2、格式字符o
格式字符o⽤于以⼋进制形式输出整数。有以下⼏种⽤法:
(1)%o
按整型数据的实际长度输出。
(2)%mo
m 为指定的输出字段的宽度。如果数据的位数⼩于m,则左端补以空格;若⼤于 m,则按实际位数输出。
(3)%lo
输出长整型数据。
cpp
#include <stdio.h>
int main()
{
int i = 123;
printf("%d,%o\n", i, i);
return 0;
}
输出结果如下
cpp
123,173
注意:
由于⼋进制数不带符号,故将内存单元中各位转换成⼋进制时将符号位也⼀起作为⼋进制数的⼀部分输出。
3、格式字符x
格式字符x⽤于以⼗六进制形式输出整数。有以下⼏种⽤法:
(1)%x
按整型数据的实际长度输出。
(2)%mx
m 为指定的输出字段的宽度。如果数据的位数⼩于 m,则左端补以空格, 若⼤于 m,则按实际位数输出。
(3)%lx
输出⻓整型数据。
cpp
#include <stdio.h>
int main()
{
int i = 123;
printf("%d,%o,%x\n", i, i, i);
return 0;
}
输出结果如下
cpp
123,173,7b
4、格式字符u
格式字符u⽤于以⼗进制形式输出⽆符号型数据。 下⾯举例说明格式字符u的具体应⽤。
cpp
#include <stdio.h>
int main()
{
int i, j;
i = -3, j = 3;
printf("%d,%d\n", i, j);
printf("%u,%u\n", i, j);
return 0;
}
输出结果如下
cpp
-3,3
4294967293,3
5、格式字符c
格式字符c⽤于输出⼀个字符。
说明:
0~255范围内的整数,也可以⽤字符形式输出。同样,⼀个字符数据也可以⽤整数形式输出。
cpp
#include <stdio.h>
int main()
{
int i=98;
char ch='a';
printf("%c,%d\n", i, ch);
return 0;
}
输出结果如下
cpp
b,97
6、格式字符s
格式字符s⽤于输出⼀个字符串。有以下⼏种⽤法:
(1)%s
将字符串按实际长度输出。
(2)%ms
输出的字符串占 m 列。如果字符串本⾝长度⼤于m,则突破m 的限制, 将字符串全部输出;若字符串长度⼩于 m,则左补空格。
(3)%-ms
如果字符串长度⼩于m,则在 m列范围内,字符串向左靠,右补空格。
(4)%m.ns
输出占 m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
(5)%-m.ns
输出长整型数据。输出占 m 列,但只取字符串中左端 n个字符。这n个字符输出在 m 列的左侧,右补空格。
cpp
#include <stdio.h>
int main()
{
char *str = "helloworld";
printf("%s\n", str);
printf("%10.5s\n", str);
printf("%-10.2s\n", str);
printf("%.3s\n", str);
return 0;
}
输出结果如下
cpp
helloworld
hello
he
hel
7、格式字符f
格式字符f⽤于以⼩数形式输出实型数据。有以下⼏种⽤法:
(1)%f
不指定字段宽度,整数部分全部输出,⼩数部分输出6位。
(2)%m.nf
输出的数据占 m 列,其中有n位⼩数。如果数值⻓度⼩于m,则左端补空格。
(3)%-m.nf
输出的数据占 m列,其中有n位⼩数。如果数值⻓度⼩于 m,则右端补空格。
注意:
以%f 形式输出的数据并不全都是准确的,只有前7 位数字是有效数字。双精度数同样可⽤%f输出。
cpp
#include <stdio.h>
int main()
{
float i = 1234.567898765;
double j = 1234.567898765;
printf("%f\n", i);
printf("%15.2f\n", i);
printf("%-10.3f\n", i);
printf("%f\n", j);
return 0;
}
输出结果如下
cpp
1234.567871
1234.57
1234.568
1234.567899
8、格式字符e
格式字符e⽤于以指数形式输出实型数据。有以下⼏种⽤法:
(1)%e
不指定输出数据所占的宽度和⼩数位数。
(2)%m.ne
输出的数据占m 位,其中有n位⼩数。如果数值长度⼩于m,则左端补 空格。
(3)%-m.ne
输出的数据占 m 位,其中有n 位⼩数。如果数值长度⼩于 m,则右端补空格。
注意:
输出的指数形式中的指数符号"+"算⼀位。
cpp
#include <stdio.h>
int main()
{
float i = 1234.567898765;
double j = 1234.567898765;
printf("%e\n", i);
printf("%15.2e\n", i);
printf("%-10.3e\n", j);
return 0;
}
输出结果如下
cpp
1.234568e+03
1.23e+03
1.235e+03
9、格式字符g
格式字符g⽤于以%f%e 中较短的输出宽度输出单、双精度实数, 即根据数字的⼤⼩,⾃动选择f格式或e格式。
|-------------|-------------------------|
| 表⽰输出类型的格式字符 | 含义 |
| d | 以⼗进制形式输出带符号整数(正数不输出符号) |
| o | 以⼋进制形式输出⽆符号整数(不输出前缀o) |
| x | 以⼗六进制形式输出⽆符号整数(不输出前缀Ox) |
| u | 以⼗进制形式输出⽆符号整数 |
| c | 输出单个字符 |
| s | 输出字符串 |
| f | 以⼩数形式输出单、双精度实数 |
| e | 以指数形式输出单、双精度实数 |
| g | 以%f%e中较短的输出宽度输出单、双精度实数 |
cpp
说明:
(1)除了格式字符x、e、g在使⽤时可以⼤写外,其余格式字符必须⼩写。
(2)在进⾏字符"%〞的输出时要注意,必须在格式控制中连写两个%,才能得到预期的效果。
例如:
printf("%d%%",100); //输出为:100%。