C 程序设计教程(09)—— 数据输出函数(printf)用法详解
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(09)—— 数据输出函数(printf)用法详解
- 一、C 语言的赋值语句
- 二、数据的输出 —— printf 函数
- 1、printf 函数的一般形式
- 2、格式字符
- (1)d 格式符
- (2)o 格式符
- (3)x 格式符
- (4)u 格式符
- (5)c 格式符
- (6)s 格式符
- (7)f 格式符
- (8)e 格式符
- (9)g 格式符
- 3、printf 函数格式字符使用总结
- (1)标志字符
- (2)宽度指示符
- (3)精度指示符
- (4)长度修正符
一、C 语言的赋值语句
赋值语句与赋值表达式相同,是程序中使用最多的语句之一。赋值语句的格式如下:
赋值表达式;
说明:
(1)当一个变量未获得数据时,通过赋值,就把赋值号右端的表达式的值存入该变量所代表的存储单元中。
(2)当一个变量已获得了数据,通过赋值,就把赋值号右端的表达式的值存入该变量所代表的存储单元中,并覆盖原来的值。
(3)当读取变量的值时,该变量的值并不消失。
(4)由于在赋值运算符(=)右边的表达式可以是一个赋值表达式。因此,形如 a=b=b=d=5; 的语句是正确的。按照赋值运算符的右结合性,该语句实际等价于:
d=5;
c=5;
b=5;
a=5;
(5)注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其他同类变量之间必须用逗号分隔,而赋值语句则必须用分号结尾。例如:
int i=1,j=2;
int a,b;
a=1;
b=2;
(6)严格区分赋值表达式和赋值语句。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
二、数据的输出 —— printf 函数
为了实现输入和输出功能,C 语言在其库函数中提供了一组输入输出函数:putchar(输出字符)、getchar(输入字符)、printf(格式化输出)、scanf(格式化输入)。其中 scanf 和 printf 函数是针对标准输入输出设备(键盘和显示器)进行格式化输入输出的函数。由于它们在文件 stdio.h 中定义,所以在使用它们时,应使用编译预处理命令 #include<stdio.h> 将该文件包含到程序文件中。
1、printf 函数的一般形式
printf 函数称为格式化输出函数,printf 函数的格式为:
printf("格式控制字符串",输出项列表);
说明:
(1)“格式控制字符串”是用双引号括起来的字符串,包括以下两种信息:
① 格式说明符:作用是将要输出的数据转换成指定的格式输出。由 “%” 和格式字符组成,如:%d,%f 等。
② 普通字符:即原样输出的字符。
例如:
printf("a=%d,b=%d\n",a,b);
其中:%d 是格式说明符,其余都是普通字符(包括a=、逗号 ,、b=、\n)。如果 a=10,b=20,则该输出语句的输出结果为:
a=10, b=20
(2)输出列表是需要输出的数据,输出列表中的各项要用逗号间隔,每个输出项可以是合法的常量、变量、表达式或函数。格式说明符的个数要与输出项的个数相同、一一对应且类型匹配。例如:
int a=20;
float b=13.5;
printf("a=%d,b=%f\n",a,b);
由于 printf 是函数,因此,“格式控制符” 和 “输出列表” 实际上都是函数的参数。printf 函数的一般形式也可以表示为:
printf(参数1, 参数2, ... ,参数n);
printf 函数的本质是将参数2~参数n 按参数1给定的格式输出。
2、格式字符
对不同类型的数据使用不同的格式字符,常用的有以下几种格式字符:
(1)d 格式符
用来输出十进制整数。
① %d,按整型数据的实际长度输出。
② %md,m为指定输出数据的宽度。如果数据的位数小于m,则左端补空格,若大于m,则按实际位数输出。
例如:
int a=134, b=12345;
printf("%5d,%4d",a,b); //输出结果为: 134(左侧补两个空格), 12345
③ %ld,输出长整型数据
long a=123456;
printf("%ld",a);
//如果按%d输出,会发生错误
//长整型也可以指定宽度,如:printf("%7ld",a);
//一个int型数据可以用%d或%ld格式输出
(2)o 格式符
以八进制形式输出整数。由于是将内存单元中各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即符号位也一起作为八进制数的一部分输出。例如:
int a=-1;
printf("%o",a); //输出结果为:177777
对长整型(long 型),可以使用 %lo 格式输出,也可以指定输出宽度,例如:
int a=-1;
printf("%8lo",a); //输出结果为: 177777
(3)x 格式符
以十六进制形式输出整数。同样不会出现负的十六进制数。
例如:
int a=-1;
printf("%d,%x",a,a); //输出结果为:-1,ffff
可以使用 %lx 输出长整型,也可以指定输出数据的宽度,如 %12x 等。
(4)u 格式符
以十进制输出 unsigned 型数据。
一个有符号整数(int)也可以用 %u 格式输出;反之,一个 unsigned 型数据也可以用 %d 格式输出。unsigned 型数据也可以用 %o 或 %x 输出。
(5)c 格式符
用来输出一个字符。例如:
char ch='A';
printf("%c\n",ch); //输出结果:A
一个整数,只要它的值在 0~255 之间,也可以用字符形式输出。在输出前,将该整数转换成 ASCII 字符,反之,一个字符型数据也可以用整数形式输出。例如:
char ch='A';
int x=97;
printf("%c",ch); //输出:A
printf("%d",ch); //输出:65
printf("%c",x); //输出:a
printf("%d",x); //输出:97
(6)s 格式符
用来输出一个字符串。
① %s,按实际格式输出字符串。
例如:
printf("%s","China"); //输出结果:China
② %ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若字符串小于m,则左边补空格。例如:
printf("%10s","China"); //输出结果: China
③ %-ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若字符串小于m,字符串左对齐,右边补空格。例如:
printf("%10s%d","China",20); //输出结果:China 20
④ %m.ns,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右端,左补空格。例如:
printf("%5,2s","China"); //输出结果: Ch
⑤ %-m.ns,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的左端,右补空格。例如:
printf("%-5,2s,%d","China",20); //输出结果:Ch 20
(7)f 格式符
以小数形式输出实数。(包括单精度、双精度)
① %f,系统自动指定输出宽度,使整数部分全部输出,并输出6位小数。
② %m.nf,指定输出的数据共占m列,其中有n位小数。如果数据长度小于m,则左端补空格。
③ %-m.nf,指定输出的数据共占m列,其中有n位小数。如果数据长度小于m,数据左对齐,右端补空格。
例如:
#include<stdio.h>
int main() {
float f=123.456;
printf("%f,%10f,%10.2f,%-10.2f,%.2f",f,f,f,f,f);
return 0;
}
以上程序的运行结果如下:
(8)e 格式符
以指数形式输出实数。
① %e,不指定输出数据所占的宽度和数字部分小数位数,由系统自动给出6位小数,指数部分占5位(如e+013),其中e 占一位,指数符号占一位,指数占3位。例如:
printf("%e",123.456); //输出:1.234560e+002
② %m.ne 和 %-m.ne,指定输出的数据共占m列,其中有n位小数。
(9)g 格式符
用来输出实数,根据数值的大小,自动选用 f 格式或 e 格式(选择输出时占宽度较小的一种),且不输出无意义的零。
3、printf 函数格式字符使用总结
printf 函数的格式字符
格式字符 | 说明 |
---|---|
d,i | 以带符号的十进制形式输出整数(正数不输出符号) |
o | 以八进制无符号形式输出整数(不输出前导符0) |
x,X | 以十六进无符号形式输出整数(不输出前导符0x),用小写x则输出十六进制数的a~f时以小写形式输出,用大写X时,则以大写字母输出。 |
u | 以无符号十进制形式输出整数。 |
c | 以字符形式输出,一次输出一个字符。 |
s | 输出字符串。 |
f | 以小数形式输出单精度和双精度型,隐含输出6位小数。 |
e,E | 以指数e或E形式输出实数。 |
g,G | 选用%f或%e格式中宽度较短的一种格式,不输入无意义的0。用G时,若以指数形式输出,则指数以大写表示。 |
说明:如果需要输出字符%,则在“格式控制字符串”中连续用两个%表示。例如:
printf("%f%%",0.5); //输出结果:0.50000%
在格式说明中,可以在%和上表中的格式字符之间插入以下几种附加符号。
(1)标志字符
标志字符包括-、+、#三种,具体含义如下表所示:
字符 | 意义 |
---|---|
- | 输出结果左对齐,右边填空格;默认则输出结果右对齐,左边填空格 |
+ | 输出值为正值时冠以“+”号,为负时冠以“-”号 |
# | 八进制输出时加前缀 0;十六进制输出时加前缀 0x |
例如:
printf("%6d,%d\n",111,2); //输出结果: 111,2
printf("%-6d,%d\n",111); //输出结果:111 ,2
printf("%+d,%+d\n",111,-111); //输出结果: +111,-111
printf("%#o,%#x\n",10,16); //输出结果:012,0x10
(2)宽度指示符
用来设置输出数据项的最小宽度,通常用十进制整数来表示输出的位数。如果输出数据项所需实际位数多于指定宽度,则按实际位数输出,如果实际位数少于指定的宽度则用空格填充。例如:
printf("%d,%d\n",888,12); //输出结果:888(按实际需要宽度输出),12
printf("%6d,%d\n",888,12); //输出结果: 888(左边补3个空格),12
printf("%-6d,%d\n",888,12); //输出结果:888 ,12(右边补3个空格)
printf("%f,%d\n",888.88,12); //输出结果:888.880000(按实际需要宽度输出),12
printf("%12f,%d\n",888,12); //输出结果: 888.880000(左边补2个空格),12
printf("%g,%d\n",888,12); //输出结果:888.88(%f格式比%e格式输出宽度小),12
printf("%8g,%d\n",888,12); //输出结果: 888.88(左边补2个空格),12
(3)精度指示符
以“.” 开头,用十进制整数指定其精度。对于 float 和 double 类型的浮点数可以用 m.n 的形式在指定宽度的同时指定其精度。其中,m 用以指定输出数据所占总的宽度,n 称为精度。例如:
printf("%.5d\n",888); //输出结果:00888(数字前补0)
printf("%.0d\n",888); //输出结果:888
printf("%d,%8.3f\n", 11, 888.88); //输出结果:11, 888.880(左边补一个空格)
printf("%d,%8.1f\n", 11, 888.88); //输出结果:11, 888.9(左边补3个空格)
printf("%d,%8.0f\n", 11, 888.88); //输出结果:11, 888(左边补5个空格)
printf("%.5s","abcdefg"); //输出结果:abcde(截去超过的部分)
printf("%5s","abcdefg"); //输出结果:abcdefg(宽度不够,按实际宽度输出)
(4)长度修正符
常用的长度修正符有 h 和 l 两种,h 表示输出项按短整型输出,l 表示输出项按长整型输出。
数据输出举例:
#include<stdio.h>
int main() {
int n1=123;
long n2=1234567;
float real=123.4567;
printf("%d,%6d,%-6d,%2d\n",n1,n1,n1,n1);
printf("%ld,%8ld,%4ld\n",n2,n2,n2);
printf("%f,%10f,%10.2f,%-10.2f",real,real,real,real);
printf("%s,%10.5s,%-10.5s","student","student","student");
return 0;
}
以上程序的运行结果如下: