printf函数详解

printf函数是C语言中的格式化输出函数,用于向标准输出设备输出信息。本文详细介绍了printf函数的使用,包括转义字符、格式化字符串、参数匹配、输出样式规定如width、precision和类型标志等,并提供了多个示例来展示不同格式化字符串如何影响输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/iint接受整数值并将它表示为有符号的十进制整数,i是老式写法
ounsigned int无符号8进制整数(不输出前缀0)
uunsigned int无符号10进制整数
x/Xunsigned int无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x)
f(lf)float(double)单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用)
e/Edouble科学计数法表示的数,此处”e”的大小写代表在输出时用的“e”的大小写
g/Gdouble有效位数,如:%8g表示单精度浮点数保留8位有效数字。双精度用lg
cchar字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
s/Schar * / wchar_t *字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符)
pvoid *以16进制形式输出指针
nint *到此字符之前为止,一共输出的字符个数,不输出文本
%无输入不进行转换,输出字符‘%’(百分号)本身
m打印errno值对应的出错内容,(例: printf(“%m\n”); )

注:%g、%G在小数点位数四位或指数大于等于精度时用%e、%E,否则用%f。

转义序列

这些转义序列在字符串中会被自动转换为相应操作命令

符号意义符号意义
\a铃声(提醒)\bBackspace
\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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值