C语言复习知识
签到工作后,用人单位承诺是嵌入式方向,让我好生欢喜,而且用人单位也很负责任的为我们应届毕业生着想,委托了一家在东北地区小有名气的培训机构为我们提供价格不菲的培训, 其中当然少不了C语言,于是特意买了本《C语言的科学与艺术》好好复习C。一个博士生讲解的C语言中级教程,虽然没有多少新意,但是总有一些久而荒废的知识,贴出来不断提醒自己“温故知新”。
1.关于printf输出函数
自从学过C++后,就再也没有用过C的printf函数,与std::cout相比printf不能判断输出量的类型,而且对内存的操作,会有危险。
printf的原型中参数是常量字符串+...;返回值是整形。
其中的常量字符串中的输出格式需要注意:常用的%d、%f、%s不用多说,但是%g和%%需要说明一下:
%g表示普通型,数值用%f和%e格式中较短的一个显示,在不能事先确定输出值的情况下,他是最好的输出格式。如定义了float型的变量,如果它是一个整数值,那么以%g格式输出不会显示一堆0,好像是以%d格式输出一般,若是小数值,也不会补充一堆0,让人看得很亲切。
%%是百分号的输出表示,而不是我们常规思路那样用转义字符/。
精度控制:
负号:表示数值左对齐,没有负号右对齐;
宽度:表示输出字段的最小字符数。若要显示的数值所占空间少,则以空格 填充;若数值太大,不能在指定大小的字段中显示,那么扩大字段宽度直到能够容纳这个数值。
小数点精度:对%g而言,精度参数说明了最大有效位;%f和%e来说精度参数指定了小数点后的位数;%s而言,则表示字符串中显示的位数。
注意:小数点占一位!
返回值为int,在windows下平台下表示了printf函数输出的字符个数,或者发生输出错误的相关字节。特别注意一点:/t/n等制表换行的字符,虽然在输出是没有确切的字符显示,但是也算一个字符!
2.关于scanf()函数
这个函数一样没法识别输入量的类型,所以也要在参数表里显示指定类型,如%d,%f等等,但是有一点不同于printf的就是%f,在输出时%f可以输出double和float两种类型,但是输入时,double的位数明显大于float于是如果象这样:
double d;
scanf(“%f”,&d);
printf(“%f”,d);
就会输出%!$%#^@#%一堆不知所云的东西,原因就在于类型的宽度问题,正确的是以%lf输出。
在windows的32位系统环境下,sizeof 后short 2;int 4;float 4;double 8;但是让我不理解的是long double也是8(怎么也应该比double大呀);
在linux的32位系统环境下,sizeof后只有long double于win32不同是12。这让我少感欣慰。
但是还有一点需要注意:输入时可加上宽度限制,但是不可加精度限制;
如:char c,d;scanf(“%3c,%3c”,&c,&d);printf(“%c,%d”,c,d);若输入abcdef[Enter]则会认定abc中赋给c的是a,def中赋给d的是d。
3.getchar和putchar
这两个函数都是一次处理一个字符,以前曾写过:
while(c = getchar())
{putchar(c);
putchar('/n');...}
这次和班里的一位同学讨论说,按照常理思考应该是输入一个字符,马上输出一个字符,但当我们输入一个字符串时,会把这个字符串挨个输出一遍。
由于这两个函数都可由以上两个函数实现,所以我想是不是putchar中用到了scanf,然后向2那样把输入的字符串放到一个buffer里,然后依次截取下来,轮流处理。
而若想输入一个字符,马上输出一个字符,可能是需要系统检测keydown的中断,来处理。
这个问题还不明白,希望如果有哪位高手路过,指点一下!谢谢。
有个哲人曾说过“一知半解是危险的。”最近对这句话的体会越来越深刻。
林语堂先生说过“只用一样东西,不明白它的道理,是在不高明。”谨记慎行!
本文地址:http://www.45fan.com/dnjc/71776.html