以下是 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
:格式字符串。...
:变量列表。
- 返回值:
- 成功:返回实际写入的字符数。
- 错误:返回负数。
3. sprintf
int sprintf(char *str, const char *format, ...);
- 功能:将格式化数据写入字符串
str
。 - 参数:
str
:用于存储输出结果的目标缓冲区。format
:格式字符串。...
:变量列表。
- 返回值:
- 成功:返回写入
str
中的字符数(不包括终止符\0
)。 - 错误:返回负数。
- 成功:返回写入
- ⚠️ 注意:
sprintf
不检查缓冲区大小,容易导致缓冲区溢出。建议使用snprintf
替代。
4. snprintf
int snprintf(char *str, size_t size, const char *format, ...);
- 功能:安全版本的
sprintf
,最多写入size
个字符到str
。 - 参数:
str
:目标缓冲区。size
:缓冲区大小(包括终止符\0
的空间)。format
:格式字符串。...
:变量列表。
- 返回值:
- 如果输出长度小于
size
,则返回写入的字符数(不含终止符)。 - 如果输出长度 >=
size
,则返回应写的字符数(不包括终止符),表示被截断。
- 如果输出长度小于
二、格式化输入函数
5. scanf
int scanf(const char *format, ...);
- 功能:从标准输入读取格式化数据,并将其存储到变量中。
- 参数:
format
:格式字符串,描述输入格式(如%d
,%s
等)。...
:变量地址列表,用于接收解析后的数据。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或遇到 EOF:返回
EOF
。
6. fscanf
int fscanf(FILE *stream, const char *format, ...);
- 功能:从指定的文件流(如文件)中读取格式化数据。
- 参数:
stream
:输入流(例如stdin
, 或通过fopen
打开的文件)。format
:格式字符串。...
:变量地址列表。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或遇到 EOF:返回
EOF
。
7. sscanf
int sscanf(const char *str, const char *format, ...);
- 功能:从字符串
str
中提取格式化数据。 - 参数:
str
:源字符串。format
:格式字符串。...
:变量地址列表。
- 返回值:
- 成功:返回成功赋值的输入项数量。
- 失败或没有匹配:返回 0。
- 遇到 EOF:返回
EOF
。
三、变参形式函数(支持可变参数列表)
这些函数接受一个 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 | 输出 | 字符串 | ✅ | ✅ |