scanf/fscanf/sscanf和printf/fprintf/sprintf的对比 目录摘要一函数的对比二函数的使用1printf2scanf3fprintf4fscanf5sprintf6sscanf摘要本博客从函数参数到具体使用过程去对比这6个函数一函数对应流scanf从标准输入流中读取格式化数据通常是键盘printf将格式化数据输出到标准输出流通常是屏幕fscanf适用于所有输入流的格式化输入函数一般从指定的文件流中读取格式化的数据fprintf适用于所有输出流的格式化输出函数一般将格式化的数据写入到指定的文件流中sscanf从字符串中读取格式化的数据sprintf从字符串中读取格式化的数据标准输入流即从键盘上输入的数据流标准输出流从屏幕上输出的数据流所有输入流除了键盘还可以读取文件等流里的数据所有输出流除了屏幕还可以写在文件等流里的数据二函数的使用1printfintprintf(const char *format, ... );参数解释参数类型说明formatconst char *格式控制字符串包含格式占位符和普通字符...可变参数对应格式占位符要输出的变量函数作用按照format格式将数据输出到标准输出屏幕支持各种格式控制整数、浮点数、字符串、十六进制等不会自动换行需要手动加\n返回值返回值含义 0成功输出的字符总数负数输出失败注意事项格式占位符必须与变量类型匹配常用于调试输出、显示结果待讲完scanf再一起结合使用2scanfintscanf(const char *format, ... );参数解释参数类型说明formatconst char *格式控制字符串指定如何解析输入...可变参数对应格式占位符的变量地址需要加函数作用从标准输入键盘读取数据并存储到创建的变量中自动跳过空白字符空格、换行、制表符等遇到类型不匹配时停止注意事项变量前面必须加数组名和指针除外因为二者本身就是地址读取字符串%s会在遇到空格时停止且不检查缓冲区大小可能溢出输入缓冲区问题scanf会留下换行符影响后续输入返回值返回值含义正整数成功匹配并赋值的参数个数0没有匹配到任何数据EOF-1输入结束或发生错误使用示例#include stdio.h int main() { int age; float score; char name[50]; printf(请输入姓名); scanf(%s, name); // 字符串不需要 printf(请输入年龄); scanf(%d, age); // printf(请输入分数); scanf(%f, score); // printf(\n--- 输出信息 ---\n); printf(姓名%s\n, name); printf(年龄%d\n, age); printf(分数%.1f\n, score); return 0; }3fprintfintfprintf(FILE *stream,const char *format, ... );对比printfintprintf(const char *format, ... );仅仅多了FILE * stream参数参数解释参数类型说明streamFILE *指向要写入的文件流的指针formatconst char *格式控制字符串包含格式占位符如%d、%s等...可变参数对应格式占位符要输出的变量函数作用将格式化的数据写入到指定的文件流中返回值返回值含义 0成功写入的字符总数负数写入失败注意事项格式字符串与变量类型要匹配否则结果不可预料使用示例#include stdio.h int main() { FILE* fp fopen(test.txt, w); if (fp NULL) { perror(打开文件失败); return 1; } int age 25; float score 92.5; char name[] 张三; fprintf(fp, %s\n, name); fprintf(fp, %d\n, age); fprintf(fp, %.1f\n, score); //合成一行的写法 //fprintf(fp, %s %d %.1f\n, name, age, score); fclose(fp); fp NULL return 0; }解释说白了就是在printf的用法上增加一个FILE*类型的参数fp而已4fscanfintfscanf(FILE *stream,const char *format, ... );对比intscanf(const char *format, ... );只多了FILE * stream参数参数解释参数类型说明streamFILE *指向要读取的文件流的指针formatconst char *格式控制字符串指定如何解析数据...可变参数对应格式占位符的变量地址用于存储读取的值函数作用从文件中读取格式化的数据返回值返回值含义正整数成功匹配并赋值的参数个数0没有匹配到任何数据但可能有字符被读取EOF-1读取时到达文件尾或发生错误注意事项功能与scanf完全相同区别是scanf从键盘读取fscanf从文件读取自动跳过空白字符空格、换行、制表符等遇到类型不匹配或文件尾时停止使用示例#include stdio.h int main() { FILE* fp fopen(test.txt, r); if (fp NULL) { perror(打开文件失败); return 1; } char name[50]; int age; float score; fscanf(fp, %s, name); fscanf(fp, %d, age); fscanf(fp, %f, score); printf(%s\n, name); printf(%d\n, age); printf(%.1f\n, score); fclose(fp); return 0; }解释说白了就是在scanf的用法上增加一个FILE*类型的参数fp而已5sprintfintsprintf(char *str,const char *format, ... );对比printfintprintf(const char *format, ... );仅仅多了char *str参数参数解释参数类型说明strchar *指向目标字符串的指针formatconst char *格式控制字符串与printf相同...可变参数对应格式占位符要输出的变量函数作用按照format格式将数据输出到字符串中而不是屏幕或文件常用于将多个数据拼接成字符串会在字符串末尾自动添加\0功能与printf完全相同区别是输出目标不同返回值返回值含义 0成功写入字符串的字符总数不包括结尾的\0负数写入失败注意事项必须确保str缓冲区足够大否则会发生缓冲区溢出危险不会检查缓冲区大小使用示例#include stdio.h int main() { char buffer[100]; int age 25; float score 92.5; char name[] 张三; sprintf(buffer, 姓名%s年龄%d分数%.1f, name, age, score); printf(%s\n, buffer); return 0; }解释sprintf将多种类型的数据拼接为一个字符串然后以%s的格式成功打印字符串6sscanfintsscanf(const char *str,const char *format, ... );对比intscanf(const char *format, ... );只多了const char *str参数参数解释参数类型说明strconst char *指向要解析的源字符串的指针formatconst char *格式控制字符串与scanf相同...可变参数对应格式占位符的变量地址需要加函数作用从字符串中按照format格式读取数据并存储到变量中而不是从键盘功能与scanf完全相同区别是数据来源不同返回值返回值含义正整数成功匹配并赋值的参数个数0没有匹配到任何数据EOF-1源字符串为空或发生错误注意事项变量前面必须加数组名和指针除外常用于解析格式化字符串如日志、配置文件、网络数据包等比scanf更安全不会受输入缓冲区问题影响使用示例#include stdio.h int main() { char str[] 张三 25 92.5; char name[50]; int age; float score; sscanf(str, %s %d %f, name, age, score); printf(姓名%s\n, name); printf(年龄%d\n, age); printf(分数%.1f\n, score); return 0; }解释sscanf从一个字符串中解析出多种类型的数据将各种类型的数据分别存放进指定的空间 [ 作者 ] shylyly [ 首次发布 ] 2024.3.30❌ [ 最新修改 ] 2026.5.17 [ 声明 ] 由于笔者水平有限文中难免有疏漏或不妥之处还望读者不吝赐教。