printf中输出double的占位符

本文详细解释了在C语言中printf和scanf函数的格式说明符的正确使用方式,特别是针对浮点数输出时%f与%lf的区别,并给出了两者的参数类型对照表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天A了一道POJ2253,wa了好久,后来看了discuss才知道printf中输出double是应该用%f 而不是%lf的.只是大多数编译器都会识别而已,而也就造成了我们长期都不知道正确的写法.这儿有一篇文章,有点帮助:

转自:http://book.51cto.com/art/200901/106880.htm

12.9

问:有人告诉我不能在printf中使用%lf。为什么printf()用%f输出double型,而scanf却用%lf呢?

答:printf的%f说明符的确既可以输出float型又可以输出double型。 根据"默认参数提升"规则(在printf这样的函数的可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。参见问题15.2。

对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。

下表列出了printf和scanf对于各种格式说明符可以接受的参数类型。

格式

printf

scanf

%c

int

char *

%d, %i

int

int *

%o, %u, %x

unsigned int

unsigned int *

(续)

格式

printf

scanf

%ld, %li

long int

long int *

%lo, %lu, %lx

unsinged long int

unsigned long int *

%hd, %hi

int

short int *

%ho, %hu, %hx

unsigned int

unsigned short int *

%e, %f, %g

double

float *

%le, %lf, %lg

n/a

double *

%s

char *

char *

%[...]

n/a

char *

%p

void

void **

%n

int *

int *

%%

none

none


(严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)



转自:http://blog.youkuaiyun.com/cll131421/article/details/7746344

### C语言 `printf` 和 `scanf` 中占位符的使用方法 #### 占位符概述 在C语言中,`printf()` 函数用于向标准输出设备(通常是屏幕)打印信息,而 `scanf()` 则负责从标准输入设备(通常是指键盘)获取用户输入的信息。这两个函数都依赖于特定的格式化字符串来指定如何解释或显示数据。 #### 常见占位符及其功能 对于 `printf()` 而言,常见的占位符有: - `%d`: 整数 (int),表示十进制整数值。 - `%f`: 浮点数 (float/double),用来展示带有小数部分的数据。 - `%c`: 字符 (char),仅能代表单个字符。 - `%s`: 字符串 (string),指向由 null 结尾的一系列字符。 - `%p`: 指针地址,在调试时非常有用。 - `%u`: 无符号整型 (unsigned int) 的值。 - `%o`: 八进制形式的整数。 - `%x` 或者 `%X`: 十六进制形式的小写/大写字母加数字组合表示的整数[^1]。 而对于 `scanf()` 来说,除了上述大部分相同的占位符外还有一些特别之处需要注意: - 当读取字符串 (`%s`) 时,遇到任何空白字符都会终止扫描操作;因此无法直接通过此方式获得含有空格的名字或其他文本片段。 - 若要跳过某些不需要保存的内容可以在相应的转换说明前加上星号(*)作为赋值抑制符,例如 `%*d` 表示忽略一个整数而不存储它。 - 如果希望连续两次读入相同类型的参数之间不必留间隔,则可在两个百分比符号间加入正整数n限定宽度,如 `%7d` 只接受最多七位长度的整数输入[^3]。 #### 实际应用例子 下面是一些简单的代码实例展示了这些概念的应用场景: ```c #include <stdio.h> int main(){ char name[20]; float score; // 使用 %s 和 %f 进行输入 printf("请输入姓名和成绩:\n"); scanf("%s %f",name,&score); // 输出结果并利用不同的占位符格式化输出 printf("学生%s的成绩为%.2f\n",name,score); return 0; } ``` 该程序先提示用户输入名字与分数,之后将它们分别按照字符串(`%s`)以及浮点数(`%f`)的形式储存起来,并最终以更加美观的方式呈现出来——这里还演示了如何控制浮点数保留两位有效数字(`%.2f`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值