目录
1. 整数
1.1 十进制
1.1.1 %d
输出整数:
#include <stdio.h>
int main() {
int a = 42;
printf("%d\n", a); // 输出:42
return 0;
}
输出负数:
#include <stdio.h>
int main() {
int a = -123;
printf("%d\n", a); // 输出:-123
return 0;
}
输出0:
#include <stdio.h>
int main() {
int a = 0;
printf("%d\n", a); // 输出:0
return 0;
}
1.1.2 %i
在 C 语言中,%i 和 %d 都用于打印 有符号十进制整数,它们几乎是等效的。
#include <stdio.h>
int main() {
int a = 42;
printf("%i\n", a); // 输出:42
printf("%d\n", a); // 输出:42
return 0;
}
两者的主要区别在于:
- %d 是标准的十进制格式化说明符,用于打印整数。
- %i 也是用于打印整数,特别是在输入时,它能根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型。对于打印整数时,%i 和 %d 在输出结果上没有差别。
#include <stdio.h>
int main() {
int a;
printf("请输入一个整数:");
scanf("%i", &a); // 如果输入以 0x 开头,认为是十六进制;以 0 开头,认为是八进制
printf("你输入的整数是:%d\n", a);
return 0;
}
输入十进制:
输入八进制:
输入十六进制:
1.1.3 %hd
在 C 语言中,%hd 是用于打印 短整型(short) 整数的格式说明符。它指定输出的是一个 short int 类型的变量,这种类型的变量通常占用 2 个字节(16 位),但大小依赖于编译器和平台。
输出 short 类型变量:
#include <stdio.h>
int main() {
short a = 42;
printf("%hd\n", a); // 输出:42
return 0;
}
输出负数的 short 类型变量:
#include <stdio.h>
int main() {
short a = -123;
printf("%hd\n", a); // 输出:-123
return 0;
}
错误的类型:
#include <stdio.h>
int main() {
int a = 32768;
printf("%hd\n", a); // 错误:a 是 int 类型,不是 short
return 0;
}
会造成溢出:
1.1.4 %ld
在 C 语言中,%ld 是用于打印 长整型(long) 整数的格式说明符。它指定输出的是一个 long int 类型的变量,通常用于存储较大的整数值。
输出 long 类型变量:
#include <stdio.h>
int main() {
long a = 1234567890L; // L 表示 long 常量
printf("%ld\n", a); // 输出:1234567890
return 0;
}
输出负值的 long 类型变量:
#include <stdio.h>
int main() {
long a = -1230L; // 负值的 long 类型
printf("%ld\n", a); // 输出:-1230
return 0;
}
1.1.5 %lld
在 C 语言中,%lld 是用于打印 长长整型(long long) 整数的格式说明符。它指定输出的是一个 long long int 类型的变量,通常用于存储比 long 类型更大的整数值。
#include <stdio.h>
int main() {
long long a = 1234567890123456789LL; // LL 表示 long long 常量
printf("%lld\n", a); // 输出:1234567890123456789
return 0;
}
也能输出负值这里就不在做过多演示了。
1.1.6 %zd
在 C 语言中,%zd 是一个格式说明符,用于输出 size_t 类型 的变量。size_t 是一个无符号整数类型,通常用于表示对象的大小或数组的索引,它的大小依赖于平台(通常在 64 位平台上为 8 字节,在 32 位平台上为 4 字节)。
#include <stdio.h>
#include <stddef.h> // 包含 size_t 类型定义
int main() {
size_t size = sizeof(int); // 获取 int 类型的大小
printf("Size of int: %zu\n", size); // 使用 %zu 输出 size_t 类型变量
return 0;
}
输出数组的大小:
#include <stdio.h>
int main() {
int arr[10];
size_t size = sizeof(arr) / sizeof(arr[0]); // 计算数组元素个数
printf("Number of elements in arr: %zu\n", size); // 输出数组元素个数
return 0;
}
size_t 在指针运算中的应用:
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
size_t index = 3;
printf("Element at index %zu is: %d\n", index, arr[index]); // 输出索引位置元素的值
return 0;
}
1.1.7 %u
在 C 语言中,%u 是一个格式说明符,用于输出 unsigned int 类型的变量。具体来说,它表示输出一个无符号的整数值。
#include <stdio.h>
int main() {
unsigned int num = 4294967295; // 假设在32位系统下,无符号整型的最大值
printf("The number is: %u\n", num); // 使用 %u 输出无符号整数
return 0;
}
无符号整数只能表示零或正数,不能表示负数。如果变量是负数而用 %u 格式化输出,它会解释为一个很大的正整数,等于其补码表示的值。负数使用 %u 输出:
#include <stdio.h>
int main() {
int num = -5;
printf("num = %u\n", num); // 错误的输出:会解释为一个非常大的无符号整数
return 0;
}
因为 num 是一个 int 类型,而 %u 是为 unsigned int 设计的。-5 的补码表示被解释为一个非常大的无符号整数值(对于 32 位系统,-5 在补码下等于 4294967291)。
1.1.8 %llu
在 C 语言中,%llu 是一个格式说明符,用于输出 unsigned long long 类型的变量。unsigned long long 是一种无符号的整数类型,通常用于表示更大的数值范围。
#include <stdio.h>
int main() {
unsigned long long num = 18446744073709551615U; // 无符号长长整数的最大值
printf("The number is: %llu\n", num); // 使用 %llu 输出无符号长长整数
return 0;
}
输出负数的原理和 %u 是一样的,可以自己操作一下。
1.1.9 %lu
在 C 语言中,%lu 是一个格式说明符,用于输出 unsigned long 类型的变量。
#include <stdio.h>
int main() {
unsigned long num = 4294967295UL; // 无符号长整数,最大值(32 位系统)
printf("The number is: %lu\n", num); // 使用 %lu 输出无符号长整型
return 0;
}
输出负数的原理和 %u 也是一样的。
1.1.10 总结
占位符 | 含义 |
%d | int 、char(输出ASCII值) |
%i | 用于打印有符号十进制整数,根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型 |
%hd | short |
%ld | long int |
%lld | long long int |
%zd | size_t |
%u | unsigned int |
%llu | unsigned long long int |
%lu | unsigned long int |
1.2 八进制(%o、%ho、%lo、%llo)
通过上面总结我们也可以大概看出来一个 l 代表 long,两个 l 代表 long long,h代表short。八进制可以整理为:
占位符 | 含义 |
%o | 以八进制格式输出 int |
%ho | 以八进制格式输出 short int |
%lo | 以八进制格式输出 long int |
%llo | 八进制格式输出 long long int |
#include <stdio.h>
int main() {
int a = 123;
short b = 12345;
long c = 1234567;
long long d = 123456789;
printf("a in octal: %o\n", a); // 输出 int 类型变量 a 的八进制
printf("b in octal: %ho\n", b); // 输出 short 类型变量 b 的八进制
printf("c in octal: %lo\n", c); // 输出 long 类型变量 c 的八进制
printf("d in octal: %llo\n", d); // 输出 long long 类型变量 d 的八进制
return 0;
}
输出的八进制数字不带前缀 0。如果你希望显示 0 前缀,可以使用 # 标志,例如:%#o。
#include <stdio.h>
int main() {
int a = 123;
short b = 12345;
long c = 1234567;
long long d = 123456789;
printf("a in octal: %#o\n", a); // 输出 int 类型变量 a 的八进制
printf("b in octal: %#ho\n", b); // 输出 short 类型变量 b 的八进制
printf("c in octal: %#lo\n", c); // 输出 long 类型变量 c 的八进制
printf("d in octal: %#llo\n", d); // 输出 long long 类型变量 d 的八进制
return 0;
}
1.3 十六进制(%x、%hx、%lx、%llx)
同样的十六进制的表述可以写为:
占位符 | 含义 |
%x | 以小写字母表示十六进制输出 int 类型数据。 |
%hx | 以小写字母表示十六进制输出 short int 类型数据。 |
%lx | 以小写字母表示十六进制输出 long int 类型数据。 |
%llx | 以小写字母表示十六进制输出 long long int 类型数据。 |
%X | 以大写字母表示十六进制输出 int 类型数据。 |
%hX | 以大写字母表示十六进制输出 short int 类型数据。 |
%lX | 以大写字母表示十六进制输出 long int 类型数据。 |
%llX | 以大写字母表示十六进制输出 long long int 类型数据。 |
小写字母显示:
#include <stdio.h>
int main() {
int a = 1234;
short b = 1234;
long c = 123456789;
long long d = 123456789012345;
printf("a in hexadecimal: %x\n", a); // 输出 int 类型 a 的十六进制
printf("b in hexadecimal: %hx\n", b); // 输出 short 类型 b 的十六进制
printf("c in hexadecimal: %lx\n", c); // 输出 long 类型 c 的十六进制
printf("d in hexadecimal: %llx\n", d); // 输出 long long 类型 d 的十六进制
return 0;
}
大写字母显示:
#include <stdio.h>
int main() {
int a = 1234;
short b = 1234;
long c = 123456789;
long long d = 123456789012345;
printf("a in hexadecimal: %X\n", a); // 输出 int 类型 a 的十六进制
printf("b in hexadecimal: %hX\n", b); // 输出 short 类型 b 的十六进制
printf("c in hexadecimal: %lX\n", c); // 输出 long 类型 c 的十六进制
printf("d in hexadecimal: %llX\n", d); // 输出 long long 类型 d 的十六进制
return 0;
}
增加前缀:
#include <stdio.h>
int main() {
int a = 1234;
short b = 1234;
long c = 123456789;
long long d = 123456789012345;
printf("a in hexadecimal: %#x\n", a); // 输出 int 类型 a 的十六进制
printf("b in hexadecimal: %#hx\n", b); // 输出 short 类型 b 的十六进制
printf("c in hexadecimal: %#lX\n", c); // 输出 long 类型 c 的十六进制
printf("d in hexadecimal: %#llX\n", d); // 输出 long long 类型 d 的十六进制
return 0;
}
根据X的大小写,前缀也区分大小写:
2. 浮点数
2.1 %f
%f 会按浮点数的标准格式输出,通常保留六位小数。
#include <stdio.h>
int main() {
float a = 3.14159;
double b = 2.718281828459;
printf("a as float: %f\n", a); // 输出 float 类型 a
printf("b as double: %f\n", b); // 输出 double 类型 b (默认以 %f 输出 double)
return 0;
}
可以通过在 %f 中指定精度来控制输出的小数位数。格式为:
%<宽度>.<精度>f
- 宽度:输出的总宽度(包括整数部分、小数点和小数部分)。
- 精度:小数点后面的位数
#include <stdio.h>
int main() {
float a = 3.14159;
double b = 2.718281828459;
// 控制输出的小数位数
printf("a with 2 decimal places: %.2f\n", a); // 保留两位小数
printf("b with 4 decimal places: %.4f\n", b); // 保留四位小数
return 0;
}
2.2 %lf
在 C 语言中,%lf 是一个格式说明符,用来输出 双精度浮点数(double 类型)。虽然在 C99 标准之前,%f 和 %lf 有不同的用途(%f 用于 float,%lf 用于 double),但从 C99 标准开始,%f 和 %lf 都可以用来打印 double 类型的数据。在现代的 C 语言编程中,%lf 和 %f 在 printf 中没有区别,它们都用于打印 double 类型的值。
#include <stdio.h>
int main() {
double pi = 3.14159265358979323846;
// 使用 %f 和 %lf 打印 double 类型
printf("pi with %%f: %f\n", pi); // 输出 double 类型 pi
printf("pi with %%lf: %lf\n", pi); // 输出 double 类型 pi
return 0;
}
2.3 %Lf
在 C 语言中,%Lf 用于输出 扩展精度浮点数(long double 类型)。与 float 和 double 类型相比,long double 类型提供更高的精度和更大的数值范围,适用于需要更高精度浮点运算的情况。
#include <stdio.h>
int main() {
long double pi = 3.141592653589793238462643383279502884197169399375105820974944L;
// 使用 %Lf 打印 long double 类型
printf("pi with %%Lf: %Lf\n", pi);
return 0;
}
2.4 %e
在 C 语言中,%e 是一种格式说明符,用于以 科学计数法(也叫指数表示法)打印浮点数。科学计数法将数字表示为一个基数与 10 的幂的乘积,例如 1.23e+04 表示 1.23 × 10^4,即 12300。
使用 %e 打印浮点数时,C 语言会自动将数字转换为科学计数法的形式,通常保留六位小数(默认情况下),并且指数部分会以 e 或 E 来表示。
#include <stdio.h>
int main() {
double num1 = 12345.6789;
double num2 = 0.000123456;
// 使用 %e 打印浮点数,自动采用科学计数法表示
printf("num1 in scientific notation: %e\n", num1); // 输出:1.234568e+04
printf("num2 in scientific notation: %e\n", num2); // 输出:1.234560e-04
return 0;
}
2.5 %E
%E:%e 和 %E 的功能相同,唯一的区别是指数部分的大小写。%e 会使用小写字母 e,而 %E 会使用大写字母 E。
#include <stdio.h>
int main() {
double num1 = 12345.6789;
double num2 = 0.000123456;
// 使用 %e 打印浮点数,自动采用科学计数法表示
printf("num1 in scientific notation: %e\n", num1); // 输出:1.234568e+04
printf("num2 in scientific notation: %E\n", num2); // 输出:1.234560e-04
return 0;
}
2.6 %Le
在 C 语言中,%Le 是一种格式说明符,用于打印 长双精度浮点数(long double)类型的值,且以 科学计数法(指数表示法)显示。这里的 L 表示该类型为 long double,e 表示以科学计数法输出。
#include <stdio.h>
int main() {
long double num1 = 123456.7890123456789;
long double num2 = 0.000000123456789;
// 使用 %Le 打印 long double 类型的浮点数,采用科学计数法表示
printf("num1 in scientific notation: %Le\n", num1); // 输出:1.234568e+05
printf("num2 in scientific notation: %Le\n", num2); // 输出:1.234568e-07
return 0;
}
2.7 %g
在 C 语言中,%g 是一个格式说明符,用于输出浮点数,并且根据数值的大小自动选择最佳的表示方式,通常是 科学计数法 或 普通浮点格式。它根据值的大小来决定是以科学计数法(%e)还是以定点格式(%f)来输出浮动数。
%g 格式说明符的特点:
① 自动选择格式:%g 会根据数值的大小自动选择是使用科学计数法还是定点格式:
- 如果数字的绝对值较大或较小,通常会采用 科学计数法(%e)。
- 对于较为普通的数字,通常采用 定点表示法(%f)。
② 去除多余的零:如果数字的尾部有多余的零(例如 1.230000),%g 会去掉这些零,只保留有效数字。
③ 最大有效位数:默认情况下,%g 会打印6位有效数字,但可以通过指定精度来调整。例如,%.3g 会打印3位有效数字。
④ 指数表示法中的精度:当数字使用科学计数法输出时,%g 会保证输出适当的有效位数。
#include <stdio.h>
int main() {
double num1 = 123456.789012;
double num2 = 0.00000123456;
double num3 = 123.456;
// 使用 %g 来自动选择最佳的输出格式
printf("num1 = %g\n", num1); // 输出:123457
printf("num2 = %g\n", num2); // 输出:1.23456e-06
printf("num3 = %g\n", num3); // 输出:123.456
return 0;
}
2.8 %G
等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
2.9 %a
在 C 语言中,%a 是一个格式说明符,用于输出浮点数的 十六进制科学计数法 表示形式。它适用于 float 或 double 类型,能够以十六进制形式显示浮动数的值。
%a 的特点:
- 十六进制表示法:%a 会将浮点数转换为十六进制格式,并使用科学计数法的形式显示。例如,1.5 会被表示为 0x1.8p+0。
- p符号:%a 输出结果中的 p 表示指数部分,这个指数是以 2 为底的指数(而不是 10),这就是为什么它被称为“二进制科学计数法”。
- 格式:输出的结果通常是 0x 前缀,后跟一个十六进制的小数部分,最后是以二进制为基础的指数。
语法:
%a // 默认精度,输出十六进制形式
%.nf // n 为精度,表示小数部分的位数
#include <stdio.h>
int main() {
double num1 = 1.5;
double num2 = 3.14;
double num3 = 0.1;
// 使用 %a 输出十六进制形式
printf("num1 = %a\n", num1); // 输出:num1 = 0x1.8p+0
printf("num2 = %a\n", num2); // 输出:num2 = 0x1.91eb86p+1
printf("num3 = %a\n", num3); // 输出:num3 = 0x1.99999ap-4
return 0;
}
2.10 %A
同%a,只不过改为大写。
2.11 总结
占位符 | 含义 |
%f | float |
%lf | double |
%Lf | long double |
%e | 使⽤科学计数法的浮点数,指数部分的 e 为⼩写 |
%E | 使⽤科学计数法的浮点数,指数部分的 E 为⼤写 |
%Le | 科学计数法表⽰ long double |
%g | 6个有效数字的浮点数; 整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写 |
%G | 等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写 |
%a | ⼗六进制浮点数,字⺟输出为⼩写 |
%A | ⼗六进制浮点数,字⺟输出为⼤写 |
3. 字符
占位符 | 含义 |
%c | char |
%s | 字符串 |
3.1 %c
在 C 语言中,%c 是一个格式说明符,用于输出单个 字符 类型的数据。它会将对应的字符值作为字符打印出来,适用于 char 类型的变量。
#include <stdio.h>
int main() {
char letter = 'A';
char symbol = '#';
printf("The letter is: %c\n", letter); // 输出:The letter is: A
printf("The symbol is: %c\n", symbol); // 输出:The symbol is: #
return 0;
}
3.2 %s
在 C 语言中,%s 是一个格式说明符,用于输出 字符串 类型的数据。它会将一个以 null 字符('\0') 结尾的字符数组(即 C 风格字符串)打印出来。
#include <stdio.h>
int main() {
char str[] = "Hello, World!";
// 输出字符串
printf("The string is: %s\n", str); // 输出:The string is: Hello, World!
return 0;
}
使用 printf 输出多个字符串:
#include <stdio.h>
int main() {
char name[] = "Alice";
char greeting[] = "Good Morning!";
printf("%s, %s\n", greeting, name); // 输出:Good Morning!, Alice
return 0;
}
%s 的使用技巧:
字符串长度限制:%s 输出的字符串长度是有限制的(根据实际的字符串内容)。如果给定一个过长的字符串,printf 会从字符串的开头打印直到遇到 \0,不会发生缓冲区溢出,但如果字符串本身没有 \0,程序会继续打印直到找到一个 \0 为止,这可能会导致错误或不期望的行为。
格式化输出:你还可以使用宽度和精度修饰符来控制输出的格式。例如:
- %.n:限制输出的最大字符数。
- %m.n:指定输出的最小宽度和最大字符数。
4. 特殊打印格式
占位符 | 含义 |
%% | 输出⼀个百分号 |
%p | 打印地址(一个十六进制的数) |
%n | 已输出的字符串数量。 该占位符本⾝不输出,只将值存储在指定变量之中 |
5. 全章总结
占位符 | 含义 |
%d | int 、char(输出ASCII值) |
%i | 用于打印有符号十进制整数,根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型 |
%hd | short |
%ld | long int |
%lld | long long int |
%zd | size_t |
%u | unsigned int |
%llu | unsigned long long int |
%lu | unsigned long int |
%o | 以八进制格式输出 int |
%ho | 以八进制格式输出 short int |
%lo | 以八进制格式输出 long int |
%llo | 八进制格式输出 long long int |
%x | 以小写字母表示十六进制输出 int 类型数据。 |
%hx | 以小写字母表示十六进制输出 short int 类型数据。 |
%lx | 以小写字母表示十六进制输出 long int 类型数据。 |
%llx | 以小写字母表示十六进制输出 long long int 类型数据。 |
%X | 以大写字母表示十六进制输出 int 类型数据。 |
%hX | 以大写字母表示十六进制输出 short int 类型数据。 |
%lX | 以大写字母表示十六进制输出 long int 类型数据。 |
%llX | 以大写字母表示十六进制输出 long long int 类型数据。 |
%f | float |
%lf | double |
%Lf | long double |
%e | 使⽤科学计数法的浮点数,指数部分的 e 为⼩写 |
%E | 使⽤科学计数法的浮点数,指数部分的 E 为⼤写 |
%Le | 科学计数法表⽰ long double |
%g | 6个有效数字的浮点数; 整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写 |
%G | 等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写 |
%a | ⼗六进制浮点数,字⺟输出为⼩写 |
%A | ⼗六进制浮点数,字⺟输出为⼤写 |
%c | char |
%s | 字符串 |
%% | 输出⼀个百分号 |
%p | 打印地址(一个十六进制的数) |
%n | 已输出的字符串数量。 该占位符本⾝不输出,只将值存储在指定变量之中 |