在C语言中,`printf` 和 `snprintf` 是用于格式化输出的常用函数。它们支持多种格式说明符,用于处理不同类型的数据。以下是这些函数常用的格式说明符及其组合类型的总结:
### 基本格式说明符
| 格式说明符 | 描述 |
|————|——————————–|
| `%d` | 有符号十进制整数 |
| `%u` | 无符号十进制整数 |
| `%o` | 八进制整数 |
| `%x` | 十六进制整数(小写字母) |
| `%X` | 十六进制整数(大写字母) |
| `%f` | 浮点数 |
| `%e` | 科学计数法(小写字母e) |
| `%E` | 科学计数法(大写字母E) |
| `%g` | 通用浮点格式(自动选择%f或%e) |
| `%G` | 通用浮点格式(自动选择%f或%E) |
| `%c` | 字符 |
| `%s` | 字符串 |
| `%p` | 指针地址 |
| `%n` | 写入的字符数(存储在参数中) |
| `%%` | 百分号本身 |
### 长度和精度修饰符
| 修饰符 | 描述 |
|————–|——————————–|
| `h` | 短整型(用于 `%d`, `%o`, `%x`, `%u`) |
| `hh` | char 类型(用于 `%d`, `%o`, `%x`, `%u`) |
| `l` | 长整型(用于 `%d`, `%o`, `%x`, `%u`, `%f`) |
| `ll` | 长长整型(用于 `%d`, `%o`, `%x`, `%u`) |
| `L` | 长双精度浮点型(用于 `%f`, `%e`, `%g`, `%G`) |
| `.n` | 精度(用于浮点数和字符串) |
| `*` | 宽度和精度由参数指定 |
### 组合示例
1. **整数类型**
• `%d`:有符号十进制整数
• `%u`:无符号十进制整数
• `%o`:八进制整数
• `%x`:十六进制整数(小写)
• `%X`:十六进制整数(大写)
• `%hd`:短整型
• `%hu`:无符号短整型
• `%hhd`:char 类型(有符号)
• `%hhu`:char 类型(无符号)
• `%ld`:长整型
• `%lu`:无符号长整型
• `%lld`:长长整型
• `%llu`:无符号长长整型
2. **浮点类型**
• `%f`:单精度浮点数
• `%lf`:双精度浮点数(通常与 `%f` 相同)
• `%Lf`:长双精度浮点数
• `%e`:科学计数法(小写e)
• `%E`:科学计数法(大写E)
• `%g`:通用浮点格式(自动选择 `%f` 或 `%e`)
• `%G`:通用浮点格式(自动选择 `%f` 或 `%E`)
• `%.2f`:保留两位小数的浮点数
• `%10.2f`:总宽度为10,保留两位小数的浮点数
3. **字符和字符串**
• `%c`:单个字符
• `%s`:字符串
• `%.*s`:动态指定长度的字符串
4. **指针**
• `%p`:指针地址
5. **其他**
• `%n`:写入的字符数(存储在参数中)
• `%%`:百分号本身
### 示例代码
“`c
#include <stdio.h>
int main() {
int a = 123;
unsigned int b = 456;
char c = 'A';
float d = 123.456;
double e = 12345.6789;
char *str = "Hello, World!";
void *ptr = &a;
printf("a Integer: %d\n", a);
printf("a Octal: %o\n", a);
printf("a Hexadecimal (lower): %x\n", a);
printf("a Hexadecimal (upper): %X\n", a);
printf("a Short Integer: %hd\n", (short)a);
printf("b Unsigned Integer: %u\n", b);
printf("b Unsigned Short Integer: %hu\n", (unsigned short)b);
printf("c Char[%%c,%%d]: %c, %d\n", c, c);
printf("String[%%s]: %s\n", str);
printf("Pointer[%%p]: %p\n", ptr);
printf("Float[%%.2f]: %.2f\n", d);
printf("Float[%%.3f]: %.3f\n", d);
printf("Double:[%%.4lf] %.4lf\n", e);
printf("Double:[%%.5lf] %.5lf\n", e);
printf("Scientific Notation: %e\n", e);
printf("General Format: %g\n", e);
printf("Width and Precision: %10.2f\n", d);
printf("Dynamic String Length: %.*s\n", 5, str);
int chars_written;
int ret = printf("Number of characters written: %n\n", &chars_written); // 注意:%n 不会输出任何内容,但会将写入的字符数存储在 chars_written 中
printf("chars written:%d print return:%d\n", chars_written,ret);
}
“`
### 参考文档
如果你需要更详细的信息,可以参考以下官方文档:
1. **GNU C Library (glibc) 文档**:
• [printf](https://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html)
• [snprintf](https://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html#Formatted-Output-Functions)
2. **C标准库文档**:
• [C11 Standard – The fprintf function](https://en.cppreference.com/w/c/io/fprintf)
3. **cppreference.com**:
• [std::printf](https://en.cppreference.com/w/c/io/fprintf)
• [std::snprintf](https://en.cppreference.com/w/c/io/snprintf)
这些文档提供了详细的格式说明符及其用法,可以帮助你更深入地理解和使用 `printf` 和 `snprintf` 函数。