2.1 printf输出的小奥妙

需要注意printf输出字符串时,“\n”之前和之后的空格含义不同,前面的空格没有影响,即如下两条语句


printf 
("Hardness=%d   \n"
,2
);
printf 
("Hardness=%d\n "
,2
);
  

的输出是对齐的。而下面两条语句


printf 
("Hardness=%d\n  "
,2
);
printf 
("Hardness=%d\n "
,2
);
  

的输出是不对齐的,输出为


Hardness=2
  Hardness=2
  

即第2条语句前面的空格数由第1条语句“\n”后面的空格数决定。当要输出多行左对齐的信息时,要特别注意。例如原来是想输出左对齐,但语句


double a=5.8
,b=9.6
;
printf 
( "%f\n    "
,a
);
printf 
( "%f\n"
,b
);
  

的输出则为


5.800000
    9.600000
  

这是因为在两个双引号之间的空格也是输出信息的组成部分,输出换行之后,信息并没有输出完毕,后面的空格被输出到下一行,造成第2个输出语句从空格之后开始。看看下面程序的运行结果,就会恍然大悟。


#include <stdio.h>
void main
()
{
     double a=5.8
,b=9.6
;
     printf 
("a=%f\nb=%f\n"
,a
,b
);
     printf 
("We are Here
!\nWhere are you
?\nBye
!\n"
);
}
  

输出结果如下。


a=5.800000
b=9.600000
We are Here
!
Where are you
?
Bye
!
  

printf函数的一般格式为


printf
(格式控制,输出量表);
  

格式控制是用双引号("")引起来的字符串,也称“控制字符串”。它包括普通字符串和格式说明。其中普通字符串是需要原样输出的字符,遇到“\n”则换到下一行。格式说明由“%”和格式符(d、f、c、s、o、x、u等)组成(如%d和%f等)。它的作用是将输出的数据转换为指定格式输出。格式说明总是由“%”字符开始,但必须符合要求。如下语句


int a=45
;
printf
("%%d\n"
,a
);
  

多了一个“%”号,输出的结果就是错的。

【例2.1】能给出如下语句的输出结果吗?


#include <stdio.h>
void main
()
{
     double a=5.8
,b=9.6
; int d=98
; 
     char s='w'
,st="OK"
;
     printf 
("a=%F\nb=%f\n"
,a
,b
);
     printf 
("d=%D\nd=%d\n"
,d
,d
);
     printf 
("s=%C\ns=%c\n"
,s
,s
);
     printf 
("s=%S\ns=%s\n"
,st
,st
);
}
  

不能!因为格式符没有规定大小写之分,所以必须区别对待。以VC(Visual C的简写)为例,对于十进制数值,只能是小写字符,所以%F和%D是无效的。对字符而言,大小写均可(%c与%C等效),但对字符串,则只能用%s,不能用%S。不同的编译系统可能也有区别。虽然从下面的输出结果中可以看出一些规律,但变量d的地址与机器的硬件有关。


a=
,b=5.800000
d=D
,d=21
d=15
,d=15
d=O
,d=25
s=w
,s=w
st=
,st=OK
p=U
,p=1245036
  

它们对小写总是有效的,所以不要去记它们,统一使用小写字母即可。另外,对格式符进行修饰的long,则既可以使用小写字母l,也可以使用大写字母L。

最容易混淆的还是%c和%s。程序语句


char c1='W'
,c2='e'
,st="We"
;
printf 
("%c%c
,%s\n"
,c1
,c2
,st
);
  

的输出是“We,We”。不要混用格式符,下面的语句


double a=3.5
;
printf
("%d\n"
,a
);
  

的输出结果是错的(输出0),原因是错用了格式符%d(应该使用%f)。

《C语言解惑》