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函数的特点:
- 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 里面参数 可以变化 可多可少
- 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 的第一个参数是需要输出的字符以及需要被替换的占位符
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
printf的 第一个字符串 是你输出的字符串 其中包含的占位符 %d %c 这些后面会讲
你先知道有这个东西 站位 等待后面变量放入就行
- printf 的第二及后续参数将依次替换占位符
printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
前后占位符和变量数对找关系
%d ----a
%f-----b
%c-----c
%d-----c
- 占位符的类型和数量需要与后续的参数类型和数量对应
printf("整型a为%d 浮点b为%f ", a, b);
字符串中两个站位符 后面就需要2个变量
%d对应整数 a就应是整数 %f对应小数 b就应是小数
数量和类型一一对应
知道了规范 那就规范输出吧
输出整数类型 %d %u
有符号整型打印
对于有符号位的整型 char , short ,传入 printf 的可变参数时,会被提升为 int 。而比 int 更高级的
整型则不发生变化
char,short,int使用 %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 。
转换规范 %符号 的完整
- 转换操作
转换操作由单个字符表示,取自下面这个集合: 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 |
---|---|---|
l | d或i | sizeof(long) |
ll | d或i | sizeof(long long) |
l | u或o或x或X | sizeof(unsigned long) |
ll | u或o或x或X | sizeof(unsigned long long) |
h | d或i | sizeof(short) |
hh | d或i | sizeof(char) |
h | u或o或x或X | sizeof(unsigned short) |
hh | u或o或x或X | sizeof(unsigned char) |
在转换操作前增加一个 l 长度指示符,可以将转换操作获取的二进制长度升为更高一级的类型长度。
在转换操作前增加一个 h 长度指示符,可以将转换操作获取的二进制长度降为更低一级的类型长度
精度
- 整数d、i、o、u、x、X所打印的最小数字位数,不足将补齐。
- 小数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;
}