C语言_格式化输入输出

C语言_格式化输入输出

我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d 说明要整数的类型,%f说明要以浮点数输出

  • printf()
  • %[flags][width][.prec][hlL]type
  • scanf()
  • %[flag]type

我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d 说明要整数的类型,%f说明要以浮点数输出,殊不知这其中还有很多数值....

  • %[flags][width][.prec][hlL]type
type含义
-左对齐
+在前面放+或-
(space)正数留空
00填充
我们来试一下这样的事情,如下 做一个简单的模型
1 printf("%9d 2",123); 3 printf("%-9d 4",123);

第一个%9d表示后面数字的输出占据九个字符的空间,并且是右对齐的,所以前面留出来空格 而第二个带-号表示是左对齐

"+" 号含义是后面要跟上+号或者- 号,我们试试

1 printf("%+9d 2",123); 3 printf("%+-9d 4",123);

运行结果: 在这里插入图片描述 果不其然 ,前面加上了+号

1printf("%+9d 2",-123); 3printf("%+-9d 4",-123);

运行结果: 在这里插入图片描述 这样都没什么问题 其实如果不要第二行这个+ 号,编译器也同样会加上-号的,那么我们加0呢

1printf("%09d 2",123); 3printf("%0-9d 4",-123);

运行结果: 在这里插入图片描述 可以看到右对齐的前面补了零,而左对齐的-123是不能补零的,总不能向后填零吧

width或prec含义
number最小字符数
*下一个参数是字符数
.number小数点后的位数
.*下一个参数是小数点后的位数
1printf("%9.2f 2",123.0);

运行结果: 在这里插入图片描述 这里注意一下, 小数点前面的9指的是整个数字包括小数点以及小数点后面的0,总和占9个字符 而不是小数点前面占9个字符,.2f 表示精确到小数点后俩位 那么那个*又是表达什么意思呢

1printf("%*d 2",5,123); 3printf("%9.2f 4",123.0);

运行结果: 在这里插入图片描述 可以看到第一行后面的形参多了一个,就好比把5 这个值替换了*,而后面的123是用来满足这个%d的,原本要填入%后面的数字,现在可以替换出来,而一旦变成后面的参数,那他就可以是一个变量了,而不是常量,给我们的代码格式带来了很大的灵活性

类型修饰含义
hh单个字节
hshort
llong
lllong long
Llong double
type作用
i或dint
uunsigned int
a或A十进制浮点数
0八进制
cchar
x十六进制
s字符串
X字母大写的十六进制
p指针
f或Ffloat
n读写/写入的个数
e或E指数
暂时列出来,有些学到后面会慢慢遇见 ,不过这里要讲一下n这个type
1int num; 2printf("%dsos%n 3",12345,&num);

运行结果: 在这里插入图片描述 字符串后面的第一个参数12345,满足了%d,后面的sos也输出了, %n说明符输出有效字符数量,然后把个数传入后面的指针里。

  • scanf
  • %[flag]tpye
flag含义
*跳过
数字最大字符数
hhchar
hshort
llong ldouble
lllong long
Llong double

有一点我们需要注意,我们要确保转换说明的数量、类型、和后面的参数的数量、类型一样,例如下面的语句中有俩个%d转换说明,说明后面还有俩个参数

1printf("%d 个苹果 %d 元 2",number,money);

后面的确有俩个参数 用来满足俩个%d转换说明 现在C语言通过函数原型机制检查函数调用时参数的个书和类型是否正确,但是这对printf()和scanf()函数不起作用,原因是因为这个俩个函数的参数个数可变,如下:

1int a=4; 2int b=6; 3float x=3.14f; 4float y=8.0f; 5printf("%d 6",a,b); //参数过多 7printf("%d %d 8",a); //参数过少 9printf("%d %d 10",x,y); //转换说明类型不匹配

运行结果: 在这里插入图片描述 用%d显示float类型的值,这个值不会被转成int类型,在不同的平台下面,运行结果也会导致不同

注意:通常3.14和8.0都会被编译器存储在64位的double类型中,使用双精度进行乘法运算,然后将乘积截断成float的快读,这样虽然计算精度更高,但无疑会减慢运行速度,我们不是在做非常精确的计算 ,所以不用那么精准,可以在浮点数后面加上F或f后缀就可以覆盖编译器默认的是指,编译器会将浮点类型常量看作float类型 ** 没有后缀的浮点常量是double类型。** 很显然这都不是我们想要的结果,所有的编译器都能编译并且运行这个程序,但是大部分的编译器都会给予警告,的确,有些编译器会捕捉到这类问题,但是c标准没有对此多要求,所以,计算机在运行时可能不会捕捉到这类错误,如果程序正常运行,很难察觉出来,大概只有程序没有打印出你所期望的或者意想不到的值的时候,你才会去检查prinf()函数中的参数类型和个数是否正确

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593

C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c