请教一个C语言的问题,关于单片机printf函数数

printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。
printf函数调用的一般形式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为:
& & printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:
“%d”表示按十进制整型输出;
“%ld”表示按十进制长整型输出;
“%c”表示按字符型输出等。
非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
【例4-3】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);
本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。第3行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。第4行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。第5行的格式串要求按字符型输出a、b值。第6行中为了提示输出结果又增加了非格式字符串。
格式字符串
在Turbo C中格式字符串的一般形式为:
& & [标志][输出最小宽度][.精度][长度]类型。
其中方括号[]中的项为可选项。
各项的意义介绍如下。
类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
以十进制形式输出带符号整数(正数不输出符号)
以八进制形式输出无符号整数(不输出前缀0)
以十六进制形式输出无符号整数(不输出前缀Ox)
以十进制形式输出无符号整数
以小数形式输出单、双精度实数
以指数形式输出单、双精度实数
以%f或%e中较短的输出宽度输出单、双精度实数
输出单个字符
输出字符串
标志字符为 -、+、# 和空格四种,其意义下表所示:
结果左对齐,右边填空格
输出符号(正号或负号)
输出值为正时冠以空格,为负时冠以负号
对c、s、d、u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。
3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。
#include &stdio.h&
int main(void){
&& int a=15;
&& long float b=123.1234567;
&&& // 原来b的定义为 float b=123.1234567;
&&& // 经读者反馈,笔者发现会溢出,在前面加了long
&& double c=4567;
&& char d='p';
&& printf("a=%d\n", a);
&& printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a);& // %% 可以输出 %
&& printf("a=%f\n", b);
&& printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
&& printf("c=%f\n", c);
&& printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c);
&& printf("d=%c\n", d);
&& printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);
&& return 0;
第11行以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。
第14行以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
第17行输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。
第20行输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格。
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子。
【例4-5】在一个printf()里输出
#include &stdio.h&
int main(void){
printf("The raw value: i=%d\n", i);
printf("++i=%d \n++i=%d \n--i=%d \n--i=%d\n",++i,++i,--i,--i);
运行结果:
The raw value: i=8
【例4-6】在多个printf()里输出
#include &stdio.h&
int main(void){
printf("The raw value: i=%d\n", i);
printf("++i=%d\n", ++i);
printf("++i=%d\n", ++i);
printf("--i=%d\n", --i);
printf("--i=%d\n", --i);
运行结果:
The raw value: i=8
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。
但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。
注意:经读者反馈,我们发现原来的例子在VC6.0下计算过程比较复杂,不能直观的说明自右向左的求值顺序。上面的代码是修改后的,修改日期为 。
下面是老代码及分析:
&&& int i=8;
&&& printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
&&& int i=8;
&&& printf("%d\n",++i);
&&& printf("%d\n",--i);
&&& printf("%d\n",i++);
&&& printf("%d\n",i--);
&&& printf("%d\n",-i++);
&&& printf("%d\n",-i--);
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。
阅读(...) 评论()中scanf和printf都是输出函数,两者有什么区别呢
全部答案(共2个回答)
么。。scan啊。
是的,因为字符串不是一种基本数据类型,是字符数组,一个字符占据数组中的一个位置。给了指针后字符数组的首地址就被得到了,然后就会从首地址打印到\0出现。没有\0就...
把程序修改成下面的样子(也就是把printf语句里的空格都去掉),这样可以看得更清楚
main()
int a=123;
float b=1.23f;...
#include&stdio.h&不是必须的
stdio.h看你是否需要这个头文件里的接口(函数)或者 数据结构 不需要用的 不必引用这个头文件
不过如果你用V...
垃圾 这也不会
就是软件里面原先已经定义好的一些头文件,一般用#include"需要的函数头文件"包含进来。
譬如你在一个文件开头加了#include"studio.h",你...
亚松森El Jardin Hostal怎么样?有人住过吗?
答: 如果你理解能力强考数据库,其中比如关系数据库之类的需要去领悟
如果你记忆能力强考网络,各种各样的名词,背下来就得分。
还有官方指定的教材要有,上机最好做一做...
答: 新年好!首先,你必须了解计算机的组成和结构以及操作系统的运作原理,这是基础
如果你想学习开发多线程、WINDOWS应用、动态链接库、WINDOWS组件的话,建...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区C语言printf()函数小结
printf函数是最常用不过的函数了。每一个学C的人,最先接触的语句,最多接触的语句,不,应该是函数,莫过于printf了,然而,你觉得你真的了解它吗?下面来看下面几个例子,将会让你感受printf函数不一样的一面。
一、printf函数有返回值吗?如果有,是什么类型,代表什么含义?
答:看一下百度百科,你会惊讶的发现,它原来是有返回值的,而且和scanf函数一样,返回的是整型值。返回值的含义是输出地字符个数,如number=printf(”abcde");number=5;在四川大学的一次招聘会上,某知名公司来做宣讲,面试官在现场说:“我出一个很简单的,谁能答上来,当场录用;这个问题就是:printf函数的返回值是什么类型?代表什么?”现场哗然,但是没有一个人能够现场答出这么个如此简单的问题。这说明,很多人在学习C的时候,仿佛喝小酒一样,浅尝辄止,没有做深入的思考和分析。
&&& 二、int
x=7;y=5,z=x%y;
&&&&&&&&printf("\nx=%d,y=%d,x%y=%d\n",x,y,z);
请问,输出结果是什么?
答:输出结果为:x=7,y=5,x%y=%d&
&&&&&&&&分析:很多人包括我会想当然的认为,会输出x%y=2;其实那只是我们的一厢情愿。printf()函数格式输出,必须要完全匹配,遇到x%y时,x为字符,直接输出即可,%y函数会认为它是格式控制,因为%的存在,但是又没有%y这种格式,所以照原文输出;由于没有与z想匹配的格式控制,故不会输出z的值。
三、输出字符串
&&&&&&&&gets(str);
printf("%s",str);& 输出结果是什么?
答:没有输出,结果显示&null&,试分析其原因,如不知原因,请记住。正确的输出格式为;printf(str);或者puts(str);&
除非定义 str为数组,如char str[]="skdlajfl";则可用printf("%s",str);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。关于C语言中printf函数的一个问题 - zhouxqwh的专栏 - CSDN博客
关于C语言中printf函数的一个问题
对于下面的程序,我用VS2003运行的结果第一个是0,第二个是一个很大的数。
#include &stdio.h&
int main()
& & printf("%f",5);& &
& & printf("%d",5.01);& //line 2
}具体原因在论坛上提问后得到结果。引用答案如下& & 关键你要理解浮点数的存储格式!
printf("%f",5);& & //line 1
5在内存中是 0x00 00 00 05,按照float格式解释是一个无限接近于0的浮点数数
& & printf("%d",5.01);& //line 2
5.01按照整数去解释,这个数应该是一个非常大的整数帮1楼补充几句:
这是printf可变参数不做类型检查引起的。
int printf(const char *format, ...);
printf("%f",5);& & //line 1
编译器在给printf传参的时候,不知道这个5应该传什么类型,所以只能按1楼所说整数的格式传进去。在printf里面使用这个参数的时候却是按照"%f"的要求解释成了浮点数。
前面的"%f"对编译器来说就是一个普通字符串而已,编译器不懂printf的格式。
所以可变参数的函数是很危险的,尽量少用。
如果是一个普通的函数,编译器就会根据函数原型,在传参的时候自动做类型转换。
void foo(float f);
& & foo(5);
在这里编译器知道foo需要一个浮点数,事先就会把5转换成浮点数的格式传进去。
我的热门文章
即使是一小步也想与你分享}

我要回帖

更多关于 c语言printf函数原型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信