趣文网 > 综合

深入了解C语言中printf函数的使用方法和技巧

2024-01-28 07:31:41
相关推荐

C语言中的printf函数是用于在控制台输出信息的重要函数之一。它不仅可以输出变量的值,还可以格式化输出字符串、数字和特殊字符等。本文将详细解析printf函数的使用方法,包括格式化输出的各种语法规则、特殊格式符号的使用以及常见的实例演示。通过本文的学习,读者将能够全面掌握printf函数的使用技巧,提高在C语言编程中的输出表达能力和效率。

想要天天向上,就要懂得享受学习。为大家推荐c语言printf函数的使用详解,精彩的内容需要你们用心的阅读。还在等什么快点来看看吧!

printf的格式控制的完整格式:

% - 0 m.n l或h 格式字符

下面对组成格式说明的各项加以说明:

①%:表示格式说明的起始符号,不可缺少。

②-:有-表示左对齐输出,如省略表示右对齐输出。

③0:有0表示指定空位填0,如省略表示指定空位不填。

④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。

⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。

---------------------------------------

格式字符

格式字符用以指定输出项的数据类型和输出格式。

①d格式:用来输出十进制整数。有以下几种用法:

%d:按整型数据的实际长度输出。

%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。

%ld:输出长整型数据。

②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。

例:

代码如下:

main()

{

int a = -1;

printf("%d, %o", a, a);

}

运行结果:-1,177777

程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。

③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。

④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。

⑤c格式:输出一个字符。

⑥s格式:用来输出一个串。有几中用法

%s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。

%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。

%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。

%:输出占列,但只取字符串中左端个字符。这个字符输出在列的右侧,左补空格。

%-:其中、含义同上,个字符输出在列范围的左侧,右补空格。如果,则自动取值,即保证个字符正常输出。

⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:

%f:不指定宽度,整数部分全部输出并输出6位小数。

%:输出共占列,其中有位小数,如数值宽度小于左端补空格。

%-:输出共占列,其中有位小数,如数值宽度小于右端补空格。

⑧e格式:以指数形式输出实数。可用以下形式:

%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。

%和%:、和””字符含义与前相同。此处指数据的数字部分的小数位数,表示整个输出数据所占的宽度。

⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。

---------------------------------------

关于printf函数的进一步说明:

如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示,如:

printf("%f%%", 1.0/3);

输出0.333333%。

---------------------------------------

对于单精度数,使用%f格式符输出时,仅前7位是有效数字,小数6位.

对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位.

######################################拾遗########################################

由高手指点

对于m.n的格式还可以用如下方法表示(例)

char ch[20];

printf("%*.*sn",m,n,ch);

前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。

%n 可以将所输出字符串的长度值赋绐一个变量, 见下例:

int slen;

printf("hello world%n", &slen);

执行后变量被赋值为11。

又查了一下, 看到一篇文章(查看)说这种格式输出已经确认为一个安全隐患,并且已禁用。再搜搜果然这种用法都被用来搞什么溢出、漏洞之类的,随便找了一个:格式化字符串攻击笔记。

------------------------------------------

%p格式用来以十六进制整数形式输出内存地址

代码如下:

#include stdio.h

extern int etext, edata, end;

int main(void)

{

printf("etext: t%pn", &etext);

printf("edata: t%pn", &edata);

printf("end: t%pn", &end);

return(0);

}

在链接过程中,链接器ld和ld86会使用变量记录下执行程序中每个段的逻辑地址。因此在程序中可以通过访问这几个外部变量来获得程序中段的位置。链接器预定义的外部变量通常至少有etext、_etext、edata、_edata、end和_end。

变量名_etext和etext的地址是程序正文段结束后的第1个地址;_edata和edata的地址是初始化数据区后面的第1个地址;_end和 end的地址是未初始化数据区(bss)后的第1个地址位置。带下划线\_前缀的名称等同于不带下划线的对应名称,它们之间的唯一区别在于ANSI、 POSIX等标准中没有定义符号etext、edata和end。

当程序刚开始执行时,其brk所指位置与_end处于相同位置。但是系统调用sys_brk()、内存分配函数malloc()以及标准输入/输出等 操作会改变这个位置。因此程序当前的brk位置需要使用sbrk()来取得。注意,这些变量名必须看作是地址。因此在访问它们时需要使用取地址前缀 &,例如&end等。例如:

extern int _etext;

int et;

(int *) et = &_etext;// 此时et含有正文段结束处后面的地址。

下面程序predef.c可用于显示出这几个变量的地址。可以看出带与不带下划线\_符号的地址值是相同的。

代码如下:

/*

Print the symbols predefined by linker.

*/

extern int end, etext, edata;

extern int _etext, _edata, _end;

int main(void)

{

printf("&etext=%p,&edata=%p,&end=%pn", &etext, &edata, &end);

printf("&_etext=%p, &_edata=%p, &_end=%pn", &_etext, &_edata, &_end);

return 0;

}

在Linux0.1X系统下运行该程序可以得到以下结果。请注意,这些地址都是程序地址空间中的逻辑地址,即从执行程序被加载到内存位置开始算起的地址。

[/usr/root]# gcc -o predef predef.c

[/usr/root]# ./predef

&etext=4000,&edata=44c0,&end=48d8

&_etext=4000, &_edata=44c0, &_end=48d8

[/usr/root]#

如果在现在的Linux系统(例如RedHat 9)中运行这个程序,就可得到以下结果。我们知道现在Linux系统中程序代码从其逻辑地址0x08048000处开始存放,因此可知这个程序的代码段长度是0x41b字节。

[[email protected]]# ./predef

&etext=0x804841b,&edata=0x80495a8,&end=0x80495ac

&_etext=0x804841b, &_edata=0x80495a8, &_end=0x80495ac

[[email protected]]#

Linux 0.1x内核在初始化块设备高速缓冲区时(fs/buffer.c),就使用了变量名_end来获取内核映像文件Image在内存中的末端后的位置,并从这个位置起开始设置高速缓冲区。

附:

C51 printf函数

The optional characters l or L may immediately precede the type character to respectively specify long types for d, i, u, o, x, and X.

The optional characters b or B may immediately precede the type character to respectively specify char types for d, i, u, o, x, and X.

printf("%bx",(char)i);

如果是

int a; 可以sprintf(buf,"%d",a),结果正确

char a,就必须sprintf(buf,"bd",a)

如果在浮点数中,则可以sprintf(buf,"%1.3f",a)

printf("%02BX%02BXn", adch, adcl)怎么解释呢?是应该是C51上的表达方式

阅读剩余内容
网友评论
显示评论内容(4) 收起评论内容
  1. 2024-01-28 08:00★十指紧扣★[湖南省网友]IP:3407306526
    了解printf函数的使用方法是C语言编程中的第一步,但真正掌握还需要不断的实践和思考。
    顶2踩0
  2. 2024-01-28 07:53[唫][河南省网友]IP:1988073546
    printf函数看似简单,实际上可以有很多技巧,要想用得熟练需要花不少功夫。
    顶0踩0
  3. 2024-01-28 07:46清水煮墨、[北京市网友]IP:1786653671
    printf函数是C语言中非常基础的一个技能,但是要想用好并不容易,需要不断练习和总结经验。
    顶6踩0
  4. 2024-01-28 07:38hope[青海省网友]IP:3406549576
    学习C语言真的需要深入了解printf函数,这个技能对以后的编程工作非常重要。
    顶0踩0
相关内容
延伸阅读
小编推荐

大家都在看

责任与能力作文 爱国人士的作文 兔子玩偶作文 初中生话题作文题目 英语周活动英语作文 秋天来了作文三年级 写麻雀的作文100字 最感动的一件事作文300字 植物园作文500字 爱管闲事的爷爷作文 励志作文高中 颠倒的作文 成为志愿者英语作文 2014浙江高考语文作文 节约用水用电的作文 东钱湖作文 我读书的经历作文 疫情后作文 以荣誉为话题高中作文 理解话题作文 我的朋友圈作文 描写文物的作文 原来如此作文开头结尾 哇他这个人作文500字 亲情类作文结尾 放风筝作文250个字 春天的景色二年级作文 描写孔雀舞的作文 一年级写作文 我的乐园作文600字初一