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

 

Tags:

发表评论