1. 格式化输出
执行格式化输出处理的是4个printf函数。
- #include <stdio.h>
- int printf(const char *restrict format, ...);
- int fprintf(FILE *restrict fp, const char *restrict format, ...);
返回值:成功返回输出字符数,出错返回负值
- int sprintf(char *restrict buf, const char *restrict format, ...);
- int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);
返回值:成功返回存入数组的字符数,出错返回负值
printf将格式化数据写到标准输出,fprintf写至指定的流,sprintf将格式化的字符送入数组buf中。sprintf在该数组的尾端自动加一个null字节,但该字节不包括在返回值中。
注意,sprintf函数可能会造成由buf指向的缓冲区的溢出。为了解决这种缓冲区溢出问题,引入了snprintf函数。在该函数中,缓冲区长度是一个显式参数,超过缓冲区尾端写的任何字符都会被丢弃。如果缓冲区足够大,snprintf函数就会返回写入缓冲区的字符数。与sprintf相同,该返回值不包括结尾的null字节。
下列4种printf族的变体类似于上面的4种,但是可变参数表(...)代换成了arg。
- #include <stdarg.h>
- #include <stdio.h>
- int vprintf(const char *restrict format, va_list arg);
- int vfprintf(FILE *restrict fp, const char *restrict format, va_list arg);
返回值:成功返回输出字符数,出错返回负值
- int vsprintf(char *restrict buf, const char *restrict format, va_list arg);
- int vsnprintf(char *restrict buf, size_t n, const char *restrict format, va_list arg);
返回值:成功返回存入数组的字符数,出错返回负值
2. 格式化输入
执行格式化输入处理的是三个scanf函数。
- #include <stdio.h>
- int scanf(const char *restrict format, ...);
- int fscanf(FILE *restrict fp, const char *restrict format, ...);
- int sscanf(const char *restrict buf, const char *restrict format, ...);
返回值:成功返回指定的输入项数,输入出错或在任意变换前已到达文件结尾则返回EOF
若有一个字符不匹配,则停止后续处理,不再读输入的其余部分。
scanf族也支持函数使用由<stdarg.h>说明的可变参数表。
- #include <stdarg.h>
- #include <stdio.h>
- int vscanf(const char *restrict format, va_list arg);
- int vfscanf(FILE *restrict fp, const char *restrict format, va_list arg);
- int vsscanf(const char *restrict buf, const char *restrict format, va_list arg);
返回值:成功返回指定的输入项数,输入出错或在任意变换前已到达文件结尾则返回EOF