标准I/O -- 格式化输出
格式化输出函数是 C 语言中最常用的输出方式,它们允许我们按照指定的格式将数据输出到不同的目标。
常用格式化输出函数
#include <stdio.h>
int printf(const char *fmt, ...); // 输出到标准输出(stdout)
int fprintf(FILE *stream, const char *fmt, ...); // 输出到指定文件流
int sprintf(char *s, const char *fmt, ...); // 输出到字符串缓冲区
函数参数说明
fmt: 格式控制字符串,包含普通字符和格式说明符
...: 可变参数列表,对应格式说明符要输出的数据
stream : 文件指针,指定输出目标(如 stdout、stderr 或文件)
s: 字符数组(字符串缓冲区),用于接收格式化后的字符串
返回值说明
- 成功时 : 返回输出的字符个数(不包括字符串结尾的
\0)
- 出错时 : 返回
EOF(通常为 -1)
常用格式说明符
| 格式符 |
说明 |
示例 |
%d |
十进制整数 |
printf("%d", 42); |
%f |
浮点数 |
printf("%.2f", 3.14159); |
%c |
单个字符 |
printf("%c", 'A'); |
%s |
字符串 |
printf("%s", "Hello"); |
%p |
指针地址 |
printf("%p", &var); |
%x |
十六进制整数 |
printf("%x", 255); |
使用示例
#include <stdio.h>
int main() {
int age = 25;
float score = 89.5;
char name[] = "张三";
// 基本输出
printf("姓名: %s, 年龄: %d, 分数: %.1f\n", name, age, score);
// 输出到标准错误
fprintf(stderr, "错误信息: 文件打开失败\n");
// 格式化到字符串
char buffer[100];
sprintf(buffer, "用户: %s, 得分: %.2f", name, score);
printf("格式化结果: %s\n", buffer);
return 0;
}
常用格式化输入函数
#include <stdio.h>
int scanf(const char *format, ...); // 从标准输入(stdin)读取
int fscanf(FILE *stream, const char *format, ...); // 从指定文件流读取
int sscanf(const char *str, const char *format, ...); // 从字符串读取
函数参数说明
format: 格式控制字符串,指定期望的输入格式
...: 可变参数列表,必须是变量的地址(指针)
stream: 文件指针,指定输入源
str: 源字符串,从中解析数据
返回值说明
- 成功时: 返回成功匹配并赋值的输入项数量
- 出错时 : 返回
EOF(通常为 -1),或在文件结束时返回 EOF
- 部分匹配: 返回成功匹配的项数(可能小于预期)
常用格式说明符
| 格式符 |
说明 |
示例输入 |
变量类型 |
%d |
十进制整数 |
42 |
int* |
%f |
浮点数 |
3.14 |
float* |
%lf |
双精度浮点数 |
3.14159 |
double* |
%c |
单个字符 |
A |
char* |
%s |
字符串(不含空白) |
Hello |
char[] |
%[^] |
扫描字符集 |
abc123 |
char[] |
%% |
匹配百分号 |
% |
无 |
使用示例
#include <stdio.h>
int main() {
int age;
float height;
char name[50];
// 从标准输入读取
printf("请输入姓名、年龄和身高(用空格分隔): ");
int items = scanf("%s %d %f", name, &age, &height);
if (items == 3) {
printf("读取成功: %s, %d岁, %.2f米\n", name, age, height);
} else {
printf("输入格式错误,只读取了 %d 项\n", items);
}
// 从字符串读取
char data[] = "John 25 175.5";
char person_name[20];
int person_age;
float person_height;
sscanf(data, "%s %d %f", person_name, &person_age, &person_height);
printf("从字符串解析: %s, %d岁, %.1fcm\n", person_name, person_age, person_height);
// 从文件读取
FILE *file = fopen("data.txt", "r");
if (file) {
int file_value;
while (fscanf(file, "%d", &file_value) != EOF) {
printf("从文件读取: %d\n", file_value);
}
fclose(file);
}
return 0;
}
高级格式控制
1. 宽度限制
char buffer[10];
scanf("%9s", buffer); // 最多读取9个字符,留1位给\0
2. 跳过特定字符
int day, month, year;
scanf("%d/%d/%d", &day, &month, &year); // 输入: 26/06/2026
3. 字符集匹配
char letters[100];
scanf("%[a-zA-Z]", letters); // 只读取字母
4. 排除字符集
char no_digits[100];
scanf("%[^0-9]", no_digits); // 读取直到遇到数字