C语言拓展第六期:格式化输出
前边我们学习了不同种类的数据类型,为了将这些数据输出到终端我们学习了printf函数。但前边的学习更多的是简单的套用,并没有理解printf语句里每个部分的含义。于是我们有了今天的学习内容——C语言的格式化输出。在学习了本节内容后,你就可以按照自己的想法来输出各种格式的语句了。
printf函数是一个“可变参数函数” 也就是说printf函数的参数的个数和类型都是可变的,每一个参数的输出格式都有属于自己的格式声明。格式声明由“%”和格式字符组成,如“%d、%f”等,其作用是将输出的数据转换为指定的格式然后输出。
printf("%d\n",5);
“5”意为输出的数据为5,%d为以十进制整数形式输出,执行‘\n’使输出控制移到下一行的开头。其中"%d\n"称为格式控制字符串,由“格式声明”和“普通字符”组成。普通字符是指在输出时需要在输出的时候原样输出的字符。
printf("单词car中的字母的数量为 %d \n",3);
“单词car中的字母的数量为 %d \n”这里边的汉字和空格、换行符等就属于普通字符。“,”后面的部分叫做“输出表列”,输出表列中是程序需要的一些数据,可以是变量、常量或表达式。要想将“输出表列”中的参数进行输出,格式控制字符串中必然有一个格式声明与之对应,第一个格式声明对应第一个参数、第二个格式声明对应第二个参数、以此类推。
在C的学习过程中我们可能不仅仅会看到%d、%f、%c,还可能看到%e、%o、%x、%12d等等一系列奇怪的格式声明。它们究竟代表什么意思?
printf("%d\n%d\n",5,-16);
printf("%u\n%u\n",5,-16);
这时我们发现在输入为正数的时候程序正常输出正数,但是在输入为负数的时候,输出变为了一个十分奇怪的数。它似乎是一个随机产生的很大的数。其实不然,多次试验过后你会发现——如果是-x的话,输出 4294967496-x。在学习了补码等相关知识后就会明白为什么会输出这样一个数了,现在我们先知道结果就好了。我们已经尝试了不按照格式随意输入数据,得到的结果与我们预期相差甚远。有了这次的教训我们以后一定要在输入输出的时候注意——格式声明要和参数相对应。
%hd、%d、%ld 分别表示以十进制、有符号的形式输出 short、int、long 类型的整数。
%hu、%u、%lu 分别表示以十进制、无符号的形式输出 short、int、long 类型的整数
%c用来表示一个字符
printf("%c\n",'A');
有些比较调皮的同学可能还会用一些不符合要求的输入数据去尝试,来观察电脑的反映。这时候如果你去输入一个整数,比如“36”和“122”。
printf("%c\n%c\n",36,122);
这时候你会发现输入的是数字,输出的却可能是字母或符号。这是因为如果输入的整数在0~127范围内,输出时系统会将该数作为ASCII码转换成相应的字符。如果整数比较大,则把它的最后一个字节的信息以字符形式输出。
printf("%c\n%c\n",121,377);
以%c格式输出时,只考虑一个字节,377的最后一个字节中的信息是01111001,即十进制的121,这也是“y”的ASCII代码。
printf("%s\n","FUNQU KE TANG");
printf("%f\n",5.0);
这里输出的数据不指定长度,实数部分全部输出,小数部分只输出6位。
如果想更改小数的位数,可以通过在“%.n”的方式来更改。
printf("%.3f\n",56.7896);
这里的n就是保留小数的位数,保留的时候对后边的数据采取四舍五入的保留方法。
如果想对数据的宽度做出调整呢,只需要按照“%m.n”的格式来输入格式符就可以了,其中m是数据的宽度,也就是列数,n依旧是保留小数的位数。我们举个例子大家就明白了。
printf("%10.2f\n",213.5);
“2”的前边还有四个“空格”。这里我们看到输出结果是右对齐的,在程序中默认的输出结果是右对齐的,如果想要左对齐只需要在“m”前边加上个“-”。
printf("%-10.2f\n",213.5);
加上“-”也就是减号后数据就左对齐了。相应的“+”是右对齐,但是由于默认的也是右对齐,我们一般就将这个“+”省略了。
printf("%+10.2f\n",213.5);
这时的结果是这样的。
最后一个我们要介绍的是使用科学计数法来输出数据。格式也很简单“%e”或“%E”两者唯一的区别就是输出时表示科学计数法中的“e”是大写还是小写。
printf("%E\n",213.5);
printf("%e\n",213.5);
其他的格式符还有诸如八进制的“%o”、十六进制的“%x”等使用方式和上面介绍的差不多,理解其原理之后,稍稍修改一下代码便可以轻松使用。我们这里便不再一一赘述了。