C语言中printf的进阶分析

printf 函数的使用公式:

printf(“XXX占位1 XXX 占位2 XXX占位3”, 替换1, 替换2, 替换3);
占位1 对应 替换1
占位2 对应 替换2
占位3 对应 替换3

那么我们可以这样使用输出

#include <stdio.h>
int main()
{
	int a = 1;
	float b = 2.345;
	char c = 'a';
	printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
	printf("整型a为%d 浮点b为%f ", a, b);
	return 0;
}

printf函数的特点:

  1. printf 是一个变参函数。(参数的数量和类型不确定)
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
printf("整型a为%d 浮点b为%f ", a, b);
printf("整型a为%d", a);

printf 里面参数 可以变化 可多可少
  1. printf 的第一个参数是字符串
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
printf("整型a为%d 浮点b为%f ", a, b);
printf("整型a为%d", a);

第一个参数 都是字符串  后面数变量
  1. printf 的第一个参数是需要输出的字符以及需要被替换的占位符
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);

printf的 第一个字符串  是你输出的字符串  其中包含的占位符 %d %c 这些后面会讲 
你先知道有这个东西 站位 等待后面变量放入就行 
  1. printf 的第二及后续参数将依次替换占位符
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
前后占位符和变量数对找关系
%d ----a
%f-----b
%c-----c
%d-----c

在这里插入图片描述

  1. 占位符的类型和数量需要与后续的参数类型和数量对应
printf("整型a为%d 浮点b为%f ", a, b);
字符串中两个站位符 后面就需要2个变量
%d对应整数 a就应是整数  %f对应小数 b就应是小数  

数量和类型一一对应

在这里插入图片描述

知道了规范 那就规范输出吧

输出整数类型 %d %u

有符号整型打印
对于有符号位的整型 char , short ,传入 printf 的可变参数时,会被提升为 int 。而比 int 更高级的
整型则不发生变化
在这里插入图片描述

charshortint使用 %d 。
long使用 %ld 。
long long使用 %lld 
#include <stdio.h>
int main()
{
	char c = 'a';//a回转为对应的ascall码的10进制对应值
	short s = 10;
	int a = 1;
	long l = 22;
	long ll = 22;
	printf("char 转为int用%d short 转为int用%d int用%d long用%ld longlong 用%lld",c,s, a, l, ll);
	return 0;
}

无符号整形

在这里插入图片描述

#include <stdio.h>
int main()
{
	unsigned char c = 'a';//a回转为对应的ascall码的10进制对应值
	unsigned short s = 10;
	unsigned int a = 1;
	unsigned long l = 22;
	unsigned long ll = 22;
	printf("unsigned char 转为unsigned int用%u unsigned short 转为unsigned int用%u unsigned int用%u unsigned long用%lu unsigned longlong 用%llu",c,s, a, l, ll);
	return 0;
}

小数的打印

float 会被提升为 double , double 不发生变化。
结论: float,double均使用 %f 。

转换规范 %符号 的完整

在这里插入图片描述

  1. 转换操作
    转换操作由单个字符表示,取自下面这个集合: c、d、e、E、f、i、o、s、u、x、X
符号意义
c输出 char类型的ascall符号
d输出 整数
u输出 无符号整数
f输出 小数
e输出 小数按照科学计数法输出 用e表示
E输出 小数按照科学计数法输出 用E表示
o输出 无符号的8进制
x输出 无符号的16进制 小x表示
X输出 无符号的16进制 大X表示
s输出 字符串

%d

#include <stdio.h>
int main()
{
char c1 = 127;
short s1 = 767;
int n1 = -47483647;
printf("%d\n", c1);
printf("%d\n", s1);
printf("%d\n", n1);
return 0;
}

%u

#include <stdio.h>
int main()
{
unsigned char c1 = 120;
unsigned short s1 =30;
unsigned int n1 = 30;

unsigned char c2 = 255;
unsigned short s2 = 65535;
unsigned int n2 = 4294967295;

printf("%u\n", c1);
printf("%u\n", s1);
printf("%u\n", n1);

printf("%u\n", c2);
printf("%u\n", s2);
printf("%u\n", n2);
return 0;
}

%c

#include <stdio.h>
int main()
{
char c = 65;
short s = 66;
int n = 67;
printf("c=%d\n", c);
printf("s=%d\n", s);
printf("n=%d\n", n);
printf("c=%c\n", c);
printf("s=%c\n", s);
printf("n=%c\n", n);
return 0;

变量c,s,n 为比int低级或等于的整型类型。它们在进入printf时会转换为int。因此使用转换操作c,取
sizeof(int) 字节二进制数据,将数值转换为数值对应的ASCII字符并打印在控制台上。

转换操作%f,%e,%E

#include <stdio.h>
int main()
{
float f = 1.234;
double df = 1.234567;
printf("%f\n", f);
printf("%f\n", df);
printf("%e\n", f);
printf("%e\n", df);
printf("%E\n", f);
printf("%E\n", df);
return 0;
}

%o,%x,%X

#include <stdio.h>
int main()
{
unsigned int n = 123456;
printf("%u\n", n); // 十进制
printf("%o\n", n); // 八进制
printf("%x\n", n); // 十六进制,小写字母
printf("%X\n", n); // 十六进制,大写字母
return 0;
}

转换操作s

#include <stdio.h>
int main()
{
printf("%s", "Hello World\n");
return 0;
}

长度指示符
在这里插入图片描述

长度指示符转换操作二进制字节长度n
ld或isizeof(long)
lld或isizeof(long long)
lu或o或x或Xsizeof(unsigned long)
llu或o或x或Xsizeof(unsigned long long)
hd或isizeof(short)
hhd或isizeof(char)
hu或o或x或Xsizeof(unsigned short)
hhu或o或x或Xsizeof(unsigned char)

在转换操作前增加一个 l 长度指示符,可以将转换操作获取的二进制长度升为更高一级的类型长度。
在转换操作前增加一个 h 长度指示符,可以将转换操作获取的二进制长度降为更低一级的类型长度

精度
在这里插入图片描述

  1. 整数d、i、o、u、x、X所打印的最小数字位数,不足将补齐。
  2. 小数e,E,和f转换中小数点右边的数字位数
#include <stdio.h>
int main()
{
	int un = 123;
	double df = 123.456789;
	printf("%.6d\n", un); // 限制为6个最小数字位数,所以前面添加了0,补到6个数字。
	printf("%f\n", df); // 不限制小数点后的数字个数
	printf("%.0f\n", df); // 小数点后的数字个数限制为0,小数点后无数字。
	printf("%.4f\n", df); // 小数点后的数字个数限制为4,小数点后跟了4个数字。
	return 0;
}

在这里插入图片描述
最小字段宽度指定输出的字符最小为多少个字符,如果不足,将使用空格补齐到指定的最小宽度。

#include <stdio.h>
int main()
{
	int un = 1234;
	double df = 123.456789;
	printf("%2d\n", un); // 最小要求2位,有4位,不做处理。
	printf("%6d\n", un); // 只有4位,补齐到6位。
	printf("%12f\n", df); // 只有10位,补齐到12位。
	return 0;
}

第一个printf中,指定最小宽度为2位,实际有4位了,所以不做处理。
第二个printf中,指定最小宽度为6位,实际只有4位,在前面补2个空格。
第三个printf中,指定最小宽度为12位,实际只有10位,小数点也算1位,在前面补2个空格

在这里插入图片描述

标志意义
标志 0使用0而不是空格作为填充字符
标志 -打印的字符左对齐
标志 +总是产生符号,+(正数)或-(负数)
标志 #八进制前加0,十六进制前加0x
#include <stdio.h>
int main()
{
	int n = 1234;
	printf("%o\n", n);
	printf("%X\n", n);
	printf("%#o\n", n);
	printf("%#X\n", n);
	printf("%+X\n", n);
	printf("%-X\n", n);
	printf("%020X\n", n);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值