printf
printf()函数是格式化输出函数, 一般用于向标准输出设备(显示器、控制台等终端)按规定格式输出信息,其关键字最末一个字母f即为“格式”(format)之意。
输出的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
【例】printf函数举例
#include <stdio.h>
int main(void){
int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
本例中四次输出了a、b的值,但由于格式化字符串不同,输出的结果也不相同。
- 第3行的输出语句格式化字符串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。
- 第4行的printf语句格式化字符串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。
- 第5行的格式串要求按字符型输出a、b值。
- 第6行中为了提示输出结果又增加了非格式化字符串。
printf函数是一个标准库函数,在c语言里,它被定义在头文件 stdio.h中。C++中,cstdio和stdio.h这两个标准输入输出头文件里面都有printf函数。
printf()函数的调用格式为:
printf("<格式化字符串>", <参量表>);
/**********(函数的原型为)*********/
int printf(const char *format,...);//*函数返回值为整形,若成功则返回输出的字符数,输出出错则返回负值。*
“<格式化字符串>”由要输出的内容和数据格式说明组成。
输出的内容又由两部分组成,其中非格式化字符部分按照原样输出(在显示中可起到提示作用);另一部分是格式化规定字符,通常意义上格式为:
%[flags][width][.prec][F|N|h|l]type
,以“%”开始,后面跟有各种格式字符,以说明输出的数据的类型、形式、长度、小数位数等。参量表中是需要输出的一系列参数,要求必须与格式化字符串在数量和类型上应该一一对应,参数间以”,”分开。
flags
flags 规定输出样式,取值和含义如下:
字符 | 字符名称 | 说明 |
---|---|---|
- | 减号 | 左对齐,右边填充空格(默认右对齐) |
- | 加号 | 在数字前增加符号 + 或 - |
0 | 数字零 | 将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”) |
空格 | 输出值为正时加上空格,为负时加上负号 | |
# | 井号 | type是o、x、X时,增加前缀0、0x、 0X ; type是e、E、f、g、G时,一定使用小数点;type是g、G时,尾部的0保留 |
width
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
若此栏并非数值,而是’*’符号,则表示以下一个参数当做参数长度。
prec
精度格式符以“.”开头,后跟十进制整数。如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
prec 有几种情况:
- 正整数的最小位数
- 在浮点型数中代表小数位数
- 格式代表有效位数的最大值
- 在%s 格式代表字符串的最大长度
- 若为×符号则代表下个参数值为最大长度
F|N|h|l
表示指针是否是远指针或整数是否是长整数
- F 远指针
- N 近指针
- h 短整数(short int)
- l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
type
type的字符用于规定输出数据的类型,含义如下:
字符 | 对应数据类型 | 含义 |
---|---|---|
d/i | int | 接受整数值并将它表示为有符号的十进制整数,i是老式写法 |
o | unsigned int | 无符号8进制整数(不输出前缀0) |
u | unsigned int | 无符号10进制整数 |
x/X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x) |
f(lf) | float(double) | 单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用) |
e/E | double | 科学计数法表示的数,此处”e”的大小写代表在输出时用的“e”的大小写 |
g/G | double | 有效位数,如:%8g表示单精度浮点数保留8位有效数字。双精度用lg |
c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
s/S | char * / wchar_t * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符) |
p | void * | 以16进制形式输出指针 |
n | int * | 到此字符之前为止,一共输出的字符个数,不输出文本 |
% | 无输入 | 不进行转换,输出字符‘%’(百分号)本身 |
m | 无 | 打印errno值对应的出错内容,(例: printf(“%m\n”); ) |
注:%g、%G在小数点位数四位或指数大于等于精度时用%e、%E,否则用%f。
转义序列
这些转义序列在字符串中会被自动转换为相应操作命令
符号 | 意义 | 符号 | 意义 |
---|---|---|---|
\a | 铃声(提醒) | \b | Backspace |
\f | 换页 | \n | 换行 |
\r | 回车 | \t | 水平制表符 |
\v | 垂直制表符 | \’ | 单引号 |
\” | 双引号 | \ | 反斜杠 |
\? | 文本问号 | \ ooo(例如:\024) | ASCII字(OC X) |
\xhh(例如:\x20) | ASCII字符(HEX) | \xhhhh | 宽字符(2字节HEX) |
例如,WCHAR f = L’\x4e00’ 或 WCHAR b[] = L”The Chinese character for one is \x4e00”。
示例
#include<stdio.h>
#include<string.h>
int main(void)
{
charc,s[20],*p;
inta=1234,*i;
floatf=3.141592653589;
doublex=0.12345678987654321;
p="Howdoyoudo";
strcpy(s,"Hello,Comrade");
*i=12;
c='\x41';
printf("a=%d\n",a);/*结果输出十进制整数a=1234*/
printf("a=%6d\n",a);/*结果输出6位十进制数a=1234*/
printf("a=%06d\n",a);/*结果输出6位十进制数a=001234*/
printf("a=%2d\n",a);/*a超过2位,按实际值输出a=1234*/
printf("*i=%4d\n",*i);/*输出4位十进制整数*i=12*/
printf("*i=%-4d\n",*i);/*输出左对齐4位十进制整数*i=12*/
printf("i=%p\n",i);/*输出地址i=06E4*/
printf("f=%f\n",f);/*输出浮点数f=3.141593*/
printf("f=%6.4f\n",f);/*输出6位其中小数点后4位的浮点数
f=3.1416*/
printf("x=%lf\n",x);/*输出长浮点数x=0.123457*/
printf("x=%18.16lf\n",x);/*输出18位其中小数点后16位的长浮点
数x=0.1234567898765432*/
printf("c=%c\n",c);/*输出字符c=A*/
printf("c=%x\n",c);/*输出字符的ASCII码值c=41*/
printf("s[]=%s\n",s);/*输出数组字符串s[]=Hello,Comrade*/
printf("s[]=%6.9s\n",s);/*输出最多9个字符的字符串s[]=Hello,
Co*/
printf("s=%p\n",s);/*输出数组字符串首字符地址s=FFBE*/
printf("*p=%s\n",p);/*输出指针字符串p=Howdoyoudo*/
printf("p=%p\n",p);/*输出指针的值p=0194*/
getch();
return 0;
}