C语言标准格式化输入输出

C语言的标准输入输出都是我们都是在最开始的时候就用到的。但是,它们的原型也有不一样的知识值得探索。

目录

一、标准输出printf( )

(1)Flags

(2)width和.prec

(3)HlL

(4)type

二、标准输入scanf ( )


一、标准输出printf( )

你是不是看见过这样的代码?

double a = 1.12345 , b = 9.87654;
double c = b - a;
printf( "%.2lf" , c );

第三行的printf显然和以前不同。实际上,printf函数的格式化字符串中,在%和类型之间还有很多参数可选填:

%[flags][width][.prec][hlL]type

(1)Flags

Flag 含义
- 左对齐
+ 添加符号
空格 正数留空
0 ' 0 ' 填充

第一个 - 表示左对齐,具体如下:

printf("%9d \n" , 123);
printf("%-9d \n" , 123);

输出结果为:

第一个printf函数中%与d之间的9表示输出一共有九个字符,因此前面多加了9-3=6个空格;后面的printf加了左对齐符号 - ,于是贴着屏幕左侧打印。

第二个+号很容易理解,如

printf("%+d\n",123);

结果就为 “ +123 ” 。

第三项空格就是平常的空格,略过;

第四项0,就拿第一个例子说,假设代码是这样的:

printf("%09d\n",123);
printf("%-09d\n",123);

第一行输出结果为:000000123

因为‘ 9 ’告诉编译器输出要有九个字符,实际只有三个,我们又加了补零的提示,于是前面就用零补齐。

但是,值得注意的是,第二行的输出依然是靠在最左边的123,不会受0影响。

(2)width和.prec

width或.prec 含义
number 输出最小字符数
. number 小数点后输出的字符数
* 下一个参数是最小字符数
.* 下一个参数是小数点后字符数

第一个的功能就是前面的限制最小输出字符数;后面的.number实例如下:

printf("%lf\n" , 123.0);
printf("%.2lf\n" , 123.0);

这两行的输出分别是:

 前者没有加.2,系统默认精确到小数点后六位;后者限制了小数点后位数,于是只输出两位。

类似的,* 和 .* 实例如下:

printf("%9d\n",123);
printf("%*d\n",9,123);

第一行和第二行是等价的,都是输出六个空格和123。同理,下面两行也是等价的

printf("%.*lf\n",2,123.0);
printf("%.2lf\n",123.0);

都会输出 “ 123.00 ” 。这样做的意义是让程序拥有更多的灵活性,可以用变量代替格式化字符串中的输出字符限制。

(3)HlL

类型修饰(HIL) 含义
hh 以单个字节形式输出
h short
l long
ll long long
L long double

后四项相信大家都理解,那第一项是什么意思呢?来看代码:

printf("%hhd\n",12345);

这里,我们试图把12345转成单字符形式输出。而输出却是57.怎么回事呢?让我们拿出计算器。

12345的十六进制为0x3039,保留后两位,也就是39,转成十进制就是57。

也就是说,编译器把12345转成十六进制,再取出后两位转成十进制数输出。

(4)type

type 用于 type 用于
i 或 d int g float
u unsigned int G float
o 八进制 a / A 十六进制浮点
x 十六进制 c char
X 十六进制大写字母 s char * / string
f / F / lf float , double p 指针(地址)
e 或 E 指数 n 读写的个数

上表大家看看就好,比较常用的也就 d、f、c、s、p 几种,如果真要其他的自己对照即可

二、标准输入scanf ( )

scanf()的可用命令符就相对较少了:

%[flag]type

 (1)Flag

flag 含义 flag 含义
* 跳过 l long,double
number 最大字符数 ll long long
hh char L long double
h short

第一项星号的用法与printf不同,如下:

int num;
scanf("%*d%d" , &num);
printf("%d \n" , num);

假如输入123和456,打印结果只有456,说明 * 表示跳过后面一个类型的参数。

其他的和printf一样一样的,不做赘述。

(2)type

type 用于 type 用于
d int s char * / string
i int(数据能为十六进制、八进制) [...] 所允许的字符
o 八进制 p 指针(地址)
x 十六进制
u unsigned int
a / e / f / g float
c char

这里和上面的差不多,%d和%i的主要区别在于,%d只能接受十进制数,二%i则是后来新增的,支持八进制以及十六进制数的输入,更加灵活。

最后,制作不易,点个赞呗~

你可能感兴趣的:(编程语言,格式化,C++,c++,c语言,开发语言,大数据,c#)