C 标准库中常用的 格式化输入输出函数 的说明:
一、格式化输出函数
1. printf
int printf(const char *format, ...);
- 功能:将格式化的数据输出到标准输出(通常是终端/控制台)。
- 参数:
format:格式字符串,包含普通字符和格式说明符(如%d,%s等)。...:要输出的变量列表,与format中的格式说明符一一对应。
- 返回值:
- 成功:返回实际写入的字符数(不包括终止符
\0)。 - 错误:返回负数。
- 成功:返回实际写入的字符数(不包括终止符
2. fprintf
int fprintf(FILE *stream, const char *format, ...);
- 功能:将格式化数据输出到指定的文件流(如
stdout,stderr, 或打开的文件)。 - 参数:
stream:目标输出流(例如stdout,stderr, 或FILE*文件指针)。format:格式字符串。...:变量列表。
- 返回值:
- 成功:返回实际写入的字符数。
- 错误:返回负数。
#include <stdio.h>
int main() {
FILE *fp = fopen("log.txt", "w");
if (fp) {
fprintf(fp, "程序启动时间:%s\n", __TIME__);
fclose(fp);
}
return 0;
}
3. sprintf
int sprintf(char *str, const char *format, ...);
- 功能:将格式化数据写入字符串
str。 - 参数:
str:用于存储输出结果的目标缓冲区。format:格式字符串。...:变量列表。
- 返回值:
- 成功:返回写入
str中的字符数(不包括终止符\0)。 - 错误:返回负数。
- 成功:返回写入
4. snprintf
int snprintf(char *str, size_t size, const char *format, ...);
- 功能:安全版本的
sprintf,最多写入size个字符到str。 - 参数:
str:目标缓冲区。size:缓冲区大小(包括终止符\0的空间)。format:格式字符串。...:变量列表。
- 返回值:
- 如果输出长度小于
size,则返回写入的字符数(不含终止符)。 - 如果输出长度 >=
size,则返回应写的字符数(不包括终止符),表示被截断。
- 如果输出长度小于
#include <stdio.h>
int main() {
char buffer[20];
const char *name = "ZhangSan";
const char *msg = "你好";
// 最多写入 20 字节(包括 \0)
snprintf(buffer, sizeof(buffer), "%s: %s", name, msg);
printf("消息:%s\n", buffer);
return 0;
}
二、格式化输入函数
5. scanf
int scanf(const char *format, ...);
- 功能:从标准输入读取格式化数据,并将其存储到变量中。
- 参数:
format:格式字符串,描述输入格式(如%d,%s等)。...:变量地址列表,用于接收解析后的数据。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或遇到 EOF:返回
EOF。
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
printf("你输入的是:%d\n", num);
return 0;
}
6. fscanf
int fscanf(FILE *stream, const char *format, ...);
- 功能:从指定的文件流(如文件)中读取格式化数据。
- 参数:
stream:输入流(例如stdin, 或通过fopen打开的文件)。format:格式字符串。...:变量地址列表。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或遇到 EOF:返回
EOF。
#include <stdio.h>
int main() {
// 先创建测试文件
FILE *out = fopen("data.txt", "w");
fprintf(out, "100 3.14 hello\n");
fclose(out);
// 读取文件
FILE *in = fopen("data.txt", "r");
int id;
float pi;
char word[20];
fscanf(in, "%d %f %s", &id, &pi, word);
printf("ID: %d, Pi: %.2f, Word: %s\n", id, pi, word);
fclose(in);
return 0;
}
7. sscanf
int sscanf(const char *str, const char *format, ...);
- 功能:从字符串
str中提取格式化数据。 - 参数:
str:源字符串。format:格式字符串。...:变量地址列表。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或没有匹配:返回 0。
- 遇到 EOF:返回
EOF。
#include <stdio.h>
int main() {
const char *line = "name: Alice, age: 22, score: 95.5";
char name[20];
int age;
float score;
// 从字符串中提取数据
sscanf(line, "name: %s, age: %d, score: %f", name, &age, &score);
printf("姓名:%s,年龄:%d,分数:%.1f\n", name, age, score);
return 0;
}
✅ 总结对比表
| 函数 | 输入/输出目标 | 典型用途 |
|---|---|---|
printf | 屏幕(stdout) | 调试输出、用户提示 |
fprintf | 文件、流 | 写日志、保存数据 |
sprintf | 字符数组(内存) | 拼接字符串 |
snprintf | 字符数组(安全) | 安全拼接字符串(推荐) |
scanf | 键盘(stdin) | 用户输入整数、字符串等 |
fscanf | 文件 | 读取结构化文本文件 |
sscanf | 字符串 | 解析字符串中的字段(非常实用) |
三、变参形式函数(支持可变参数列表)
这些函数接受一个 va_list 类型的参数,用于处理可变参数列表,适用于封装自己的日志或打印函数。
8. vprintf
int vprintf(const char *format, va_list ap);
- 输出到标准输出,使用
va_list。
9. vfprintf
int vfprintf(FILE *stream, const char *format, va_list ap);
- 输出到指定流,使用
va_list。
10. vsprintf
int vsprintf(char *str, const char *format, va_list ap);
- 写入字符串,使用
va_list。⚠️ 不检查缓冲区大小。
11. vsnprintf
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
- 安全版本的
vsprintf,限制写入字符数。
总结对比表:
| 函数名 | 输入/输出 | 目标类型 | 是否安全 | 支持变参 |
|---|---|---|---|---|
printf | 输出 | 标准输出 | 否 | ❌ |
fprintf | 输出 | 文件流 | 否 | ❌ |
sprintf | 输出 | 字符串 | 否 | ❌ |
snprintf | 输出 | 字符串 | ✅ | ❌ |
scanf | 输入 | 标准输入 | 否 | ❌ |
fscanf | 输入 | 文件流 | 否 | ❌ |
sscanf | 输入 | 字符串 | 否 | ❌ |
vprintf | 输出 | 标准输出 | 否 | ✅ |
vfprintf | 输出 | 文件流 | 否 | ✅ |
vsprintf | 输出 | 字符串 | 否 | ✅ |
vsnprintf | 输出 | 字符串 | ✅ | ✅ |
1541

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



