C语言的语法基础
2.2.1格式输入和格式输出函数
C语言库函数提供了针对标准设备的格式输入函数scanf和格式输出函数printf。下面详细介绍这两个函数的用法。
1.printf函数
printf函数是格式化输出函数,用于向标准输出设备(通常指定为屏幕)按规定格式输出数据。printf函数的调用格式为:
printf(格式化字符串, 输出表列);
其中格式化字符串包括两部分内容:普通字符与转义字符将按原样输出到屏幕;另一部分是“输出格式说明”,以"%"开始,后跟一个或几个格式字符,用来指定输出数据的格式。
输出表列是若干个需要输出的数据项,称为函数的参数,可以是常量、变量或表达式。各参数之间用“,”分开。输出数据项与前面的“输出格式说明”必须由左至右一一对应,一个“输出格式说明”对应一个输出数据项。例如有如下程序段:
int i=1, j=255;
printf("i=%d,j=%x\n", i, j );
格式化字符串 输出表列
上述程序段运行后结果如下:
i=1,j=ff
此处格式化字符串中的普通字符 'i'、'='、','、'j'、'=' 以及转义字符'\n'(回车换行)均原样输出到屏幕,数据项的输出格式分析如图2.4:
输出格式说明%d与i 对应,它规定i以十进制整数输出
printf("i=%d,j=%x\n", i, j );
%x与j对应,它规定j以无符号十六进制数输出
图2.4 printf函数的输出格式说明与输出项的对应关系
2.调用printf函数时应注意:
(1)格式化字符串中,格式说明与输出项从左到右的数据类型必须一一匹配,否则将输出错误结果。例如执行语句printf("%d,%d\n", 123, 123.456);第一项123可以正确输出,第二项将输出错误结果。这是因为第二个格式说明"%d"要求与之对应的输出项是整型数据,但此时输出项是实型数据与之不匹配,产生输出错误;
(2)在格式化字串中,格式说明与输出项的个数必须相同。如果格式说明的个数少于输出项的个数,多余的输出项不予输出。如果格式说明的个数多于输出项的个数,则对于多余的格式将输出不确定值;
(3)printf在调用结束后将返回一个函数值,其值等于输出数据项的个数。
3. printf函数的输出格式说明
每个格式说明都必须用 "%"开头,以一个格式字符作为结束,在此之间根据需要可以插入“宽度说明”、左对齐符号“-”、长度修饰符“l”和“L”等。
(1)格式字符
格式字符用于规定输出不同的数据类型,格式字符和它们的作用如表 2.6所示。
表2.6 Turbo C 2.0 提供的输出格式字符及其作用
格式字符 |
作 用 |
d或i |
输出十进制有符号整数(正数不输出符号“+”) |
u |
输出十进制无符号整数 |
o |
无符号整数以八进制整数输出(输出时不带前导0) |
x或X |
无符号整数以十六进制整数输出(输出时不带前导0x或0X)。x用于输出abcdef,X用于输出ABCDEF |
c |
以字符形式输出单个字符 |
s |
输出字符串直至字符串结束标志'\0'为止,'\0'不输出 |
f |
以小数形式输出实型数据,系统默认整数部分全部输出,小数部分输出6位小数, 超长小数部分自动四舍五入 |
e或E |
以指数形式输出实型数据,系统默认输出1位整数和5位小数,超长部分自动四舍五入,输出格式为:[-]m.ddddde±dd,其中:m为1~9,d为0~9 |
g或G |
由系统来选择%f或%e输出格式,输出6位有效数字,不输出小数尾部的0 |
p |
输出变量的内存地址 |
% |
输出一个%号 |
(2)长度修饰符
长度修饰符加在%和格式字符之间,对于长整型数一定要加l。例如%ld表示输出一个十进制长整型数据项。长度修饰符及其作用见表2.7
表2.7 Turbo C 2.0 提供的长度修饰符及其作用
长度修饰符 |
作 用 |
F |
数据项是far指针时使用 |
N |
数据项是near指针时使用 |
l |
格式字符是d,i,o,u,x,X时,用于输出长整型数据(long int) |
L |
格式字符是e,E,f,g,G时,用于输出长双精度实型数据(long double) |
从上表可知:双精度实型数据的输出不必用%lf,只要用%f即可。但长双精度实型数据的输出必须加长度修饰符L。例如%Lf、%Le等。
(3)输出数据所占的宽度
输出数据的宽度,可以使用系统默认宽度,也可以指定输出数据的宽度,主要有以下几种方式:
① 系统默认宽度
%格式字符(例如%d、%c、%u、%f...),输出数据所占的宽度由系统决定 (通常取数据本身的宽度,不加空格)。
下面的m、n表示非负整数,m是输出数据的宽度,n是输出数据小数部分的宽度。
② 整型数据的输出宽度
%md、%mu、%mo、%mx, 按m宽度输出数据,不足m个位数,左补空格(数据右对齐)。输出宽度m前加一个负号“-”则右补空格(数据左对齐)。当数据的实际宽度超过m位时按实际长度输出。表2.8例举了各类不同整型数据的输出,输出格式化字串中的“***”以原样输出,仅作坐标参照。
表2.8 例举整型数据的输出。
输出语句 |
输出结果 |
说 明 |
printf("%d\n",12345); | 12345 | 以数据十进制的自身宽度5输出 |
printf("%10d***\n",12345); | 12345*** | 以宽度10输出,左补5个空格 |
printf("%-10d***\n",12345); | 12345 *** | 以宽度10输出,右补5个空格 |
printf("%10d***\n",-12345); | -12345*** | 以宽度10输出,左补4个空格 |
printf("%3d\n",12345); | 12345 | 以数据自身的宽度5输出 |
printf("%ld\n",1234567890); | 1234567890 | 以数据自身的宽度10输出长整型 |
printf("%d\n",1234567890); | 722 | 长整型数据,未加长度修饰符l,输出错误 |
printf("%u\n",12345); | 12345 | 以无符号十进制方式输出 |
printf("%x\n",15915); | 3e2b | 以数据十六进制的自身宽度4输出 |
printf("%10X*****\n",15915); | 3E2B***** | 以数据的十六进制输出,左补6个空格 |
printf("%-15lo***\n",123456789); | 726746425 *** | 以长整型数据的八进制输出,输出宽度为15,数据自身宽度为9右补6个空格 |
③ 实型数据的输出宽度
%m.nf、%m.ne、%m.ng,数据输出的总宽占m列,其中小数部分占n列,若数据自身宽度小于m列,则左补空格。有关小数据部分输出格式的规定如下: 当输出数据的小数位多于指定的小数宽度n时,截去右边多余的小数,并对截去的第一位小数做四舍五入处理;当输出数据的小数位少于指定的小数宽度n时,在小数的最右边补0。当输出数据的宽度大于指定的总宽度m时,小数部分仍按上述规则处理,整数部分原样输出。在输出宽度m前加一个负号“-”, 若数据自身宽度小于m列,则右补空格。
应该注意并非所有输出的数字均是有效数字,单精度(float)7~8位有效,双精度(double)15~16位有效,长双精度(long double)19~20位有效。格式说明中规定的数据宽度m和小数位宽度n再大也不能改变数据的存储精度,所输出的多余位的数字是无意义的。假设已有如下定义变量语句,
float f=12345.678;
double d=12345.6789056789;
long double ld=12345.6789056789e600l;
表2.9举例说明了使用printf函数输出上述变量f,d,ld各类实型数据的输出。
表2.9 例举实型数据的输出(变量f,d,ld在上面已经定义)
输出语句 |
输出结果 |
说 明 |
printf("%f\n",f); | 12345.677734 | 以系统默认宽度输出单精度实数,整数部分原样输出,并输出6位小数,超出精度范围的数字无意义 |
printf("%f\n",d); | 12345.678906 | 以系统默认宽度输出双精度实数,整数部分原样输出,并输出6位小数,小数后第7位四舍五入 |
printf("%10.2f\n",f); | 12345.68 | 输出宽度为10,其中整数部分原样输出,小数位占2位, 小数后第3位四舍五入,左补2个空格 |
printf("%-10.2f***\n",f); | 12345.68 *** | 输出宽度为10,其中整数部分原样输出,小数位占2位, 小数后第3位四舍五入,右补2个空格 |
printf("%10.0f\n",f); | 12346 | 不输出小位 |
printf("%10.5f\n",1.23); | 1.23000 | 输出宽度为10,其中整数部分原样输出,小数位占5位, 小数后右补3个0 |
printf("%e\n",d); | 1.23457e+04 | 以指数形式输出双精度实型数据,系统默认输出1位整数和5位小数,超长部分自动四舍五入 |
printf("%g\n",d); | 12345.7 | 由系统来选择%f或%e输出格式,输出6位有效数字 |
printf("%Le\n",ld); | 1.23457e+604 | 以指数形式输出长双精度实型数据,系统默认输出1位整数和5位小数,超长部分自动四舍五入 |
④字符串的输出宽度
%ms 输出宽度占m列,若字符串宽度小于m列,左补空格,若字符串宽度大于m列则原样输出字串。
%m.ns 输出宽度占m列,但只取字符串的左端n个字符,n小于m,左补空格。
在输出宽度m前加一个负号“-”,若字符串宽度小于m列,则右补空格。
表2.10举例说明字符串型数据的输出。
表2.10 例举字符串型数据的输出。
输出语句 |
输出结果 |
说 明 |
printf("%s\n","Hello!") ; | Hello! | 以字串实际宽度输出 |
printf("%10s\n","Hello!"); | Hello! | 输出宽度为10,字串为6个字符,左补4个空格 |
printf("%-10s***\n","Hello!"); | Hello! *** | 输出宽度为10,字串为6个字符,右补4个空格 |
printf("%10.3s\n","Hello!"); | Hel | 输出宽度为10,取左边三个字串"Hel"输出,左补7个空格 |
printf("%-10.3s***\n","Hello!"); | Hel *** | 输出宽度为10,取左边三个字串"Hel"输出,右补7个空格 |
⑤ 字符数据的输出宽度
%mc输出宽度占m列,左补m-1个空格。在输出宽度m前加一个负号“-”,则右补m-1个空格。表2.11举例说明字符型数据的输出。
表2.11 例举字符型数据的输出。
输出语句 |
输出结果 |
说 明 |
printf("%c\n",'A' ); | A | 输出宽度为1 |
printf("%5c\n",'A' ); | A | 输出宽度为5,左补4个空格 |
printf("%-5c***\n",'A' ); | A *** | 输出宽度为5,右补4个空格 |
(4)在输出的数字前加“+”号
使用%+格式字符(如%+d、%+f等),可在输出的数字前加“+”号。例如
printf("%+d, %+d, %+10.2f", 123, -456, 12345.678);
运行结果:
+123, -456, +12345.68
(5)在输出数据前加前导0
在指定输出宽度的同时,在数据前面的多余空格处填以数字0。例如
printf("%010d,%010.2f\n",-123,12345.678);
运行结果:
-000000123,0012345.68
(6)对输出的八进制数加前导0,对输出的十六进制数加前导0x
要在输出的八进制数加前导0,在输出的十六进制数加前导0x,可在%号和格式字符
o和x之间插入一个#号。例如
printf("%#o,%#x\n",65,65);
运行结果:
0101,0x41
发表评论