printf与scanf的格式区别

scanf() 与 printf()是C标准库常用到的函数。而且两个函数都可以接受一定的格式来进行输入和输出。其中有一个非常有趣的区别。

printf() 的格式包括两部分。第一部分是普通字符部分,这些字符将按照原样输出。第二部分是转换规范,是下面解释的重点。
转换标准以 % 开始, 到转换说明字符结束。举个例子来说:
程序文件名: test.c

include

include

int main() {
printf("Square root of two is: 0.12lf\n", sqrt(2));
}
编译这个文件: gcc -Wall -lm test.c
得到的结果是:
Square root of two is: 0000001.414213562373
上面printf()里面的普通字符部分是:
Square root of two is:
和最后的
\n
这两个都被原样输出,\n 换行也是原样。

0.12lf 是我们关心的部分,称之为转换规范。
% 标志着规范的开始,而 f 标志着规范的结束。
020.12lf
第一个0 是标志位,补充宽度用的。比如,根号2约等于1.414213562373。这些不到20位,需要在最开头加上0,补足20位。
第二个20是宽度位,表示输入的结果至少应该有20个字符这么宽。
小数点标志着输出数据的精度,12 表示小数点后面有12位。
l 用来准确给出转换的数据类型, 这里 l 表示 long。把一个普通数据变成长精度。
最后一位 f, 用来通知接受到的数据种类,这里是指浮点数据类型(float)。但是printf()自动会把float精度自动提升到双精度类型。所有 lf 里面的 l 是不需要的。有 f 足矣。

但是 scanf() 函数略有不同, 例如 scanf("%lf", &a)
scanf 接受的参数是一个地址变量。并不能相printf()函数那样进行自动精度提升。
如果写成 scanf("%f", &a),那么a指向的数据只是浮点单精度的。
如果写成 scanf("%lf", &a),那么a指向的数据就是双精度浮点型的。

posted @ 2020-11-16 21:54  清歌留欢  阅读(446)  评论(0编辑  收藏  举报