在C语言中,格式化字符串用于printf、scanf、fprintf、fscanf、sprintf、sscanf等函数,控制输入输出的格式。以下是格式化字符串的详细规则:
1. 基本结构
格式化字符串由以下部分组成:
%[标志][宽度][.精度][长度修饰符]类型说明符
2. 类型说明符(必需部分)
常用类型说明符:
|
说明符 |
输出格式 |
适用数据类型 |
|
%d |
十进制整数 |
int |
|
%i |
整数(自动检测进制) |
int |
|
%u |
无符号十进制整数 |
unsigned int |
|
%o |
八进制整数 |
int |
|
%x |
十六进制整数(小写) |
int |
|
%X |
十六进制整数(大写) |
int |
|
%f |
浮点数 |
float, double |
|
%F |
浮点数(大写) |
float, double |
|
%e |
科学计数法(小写e) |
float, double |
|
%E |
科学计数法(大写E) |
float, double |
|
%g |
自动选择%f或%e |
float, double |
|
%G |
自动选择%F或%E |
float, double |
|
%c |
单个字符 |
char |
|
%s |
字符串 |
char* |
|
%p |
指针地址 |
void* |
|
%a |
十六进制浮点数 |
float, double |
|
%n |
已写入字符数 |
int* |
|
%% |
百分号字符 |
无 |
3. 标志(可选)
|
标志 |
说明 |
|
- |
左对齐(默认右对齐) |
|
+ |
在正数前显示加号 |
|
空格 |
在正数前显示空格(负数前仍显示减号) |
|
# |
特殊格式: |
|
0 |
用前导0填充数字(而非空格) |
4. 宽度(可选)
指定最小字段宽度:
- 数字:最小字符数
- *:从参数列表中获取宽度值
printf("%5d\n", 10); // 输出 " 10"
printf("%*d\n", 5, 10); // 同上
5. 精度(可选)
以点号(.)开头,后跟:
- 数字:精度值
- *:从参数列表中获取精度值
对不同类型的影响:
- 整数:最小数字位数(不足补0)
- 浮点数:小数位数
- 字符串:最大字符数
printf("%.2f\n", 3.14159); // 输出 "3.14"
printf("%.5s\n", "hello world"); // 输出 "hello"
6. 长度修饰符(可选)
指定参数的大小:
|
修饰符 |
说明 |
|
hh |
char或unsigned char |
|
h |
short或unsigned short |
|
l |
long或unsigned long |
|
ll |
long long或unsigned long long |
long x = 123456789;
printf("%ld\n", x);
7. 特殊用法
scanf系列的特殊格式:
|
格式 |
说明 |
|
%[abc] |
只匹配a、b、c字符 |
|
%[^abc] |
匹配除a、b、c外的字符 |
|
%[0-9] |
只匹配数字字符 |
|
%*d |
读取但不存储(跳过该输入项) |
char str[20];
scanf("%[^\n]", str); // 读取一行(直到换行符)
printf("print str %s\n", str); // 打印输入
8. 实际应用示例
#include <stdio.h>
int main()
{
int i = 123;
float f = 3.14159;
char c = 'A';
char s[] = "Hello";
// 基本输出
printf("int: %d\n", i);
printf("float: %.2f\n", f);
printf("char: %c\n", c);
printf("string: %s\n", s);
// 格式化控制
printf("hex: %#x\n", i); // 0x7b
printf("E-counting: %.2e\n", f); // 3.14e+00
printf("8 width: %8d\n", i); // " 123"
// scanf示例
int a, b;
printf("input two integer:");
scanf("%d %d", &a, &b);
printf("sum is: %d\n", a + b);
return 0;
}
注意事项
- 类型说明符必须与参数类型匹配,否则会导致未定义行为
- scanf中使用%s时要小心缓冲区溢出,建议指定最大宽度
- 浮点数精度问题可能导致舍入误差
- 在格式字符串中使用%%表示百分号
3154

被折叠的 条评论
为什么被折叠?



