scanf与getchar的区别getchar() 是 “专精型” 函数只读取 1 个字符含空白常用于单个字符读取或清理缓冲区scanf() 是 “通用型” 函数支持多类型、多数据读取读取数值时自动跳过空白功能更强大唯一近似的场景scanf(%c, ch) 等价于 ch getchar()都读取单个字符包括空白但 scanf() 能做的远不止这些示例代码#include stdio.h int main() { // 1. 读取字符%c不跳过空白 printf(测试%c输入回车后按a\n); char ch1; scanf(%c, ch1); // 读取回车符\n printf(ch1%cASCII%d\n, ch1, ch1); // 2. 读取整数%d跳过空白 int num; printf(测试%d输入回车后按123\n); scanf(%d, num); // 跳过前面的空白读取123 printf(num%d\n, num); return 0; }fgets用法作用从指定的流stream中读取字符存入 str 数组直到遇到「换行符 \n」「文件结束 EOF」或「读满 n-1 个字符」为止最后自动在末尾加字符串结束符 \0。char *fgets(char *str, int n, FILE *stream);函数原型其中str是存放读取结果的字符数组缓冲区n是最多读取的字符数含\0 结束符stream是输入流文件 / 键盘示例代码#includestdio.h int main() { char buffer[10]; printf(enter a string(max 9):); if (fgets(buffer,10,stdin) ! NULL) { printf(You entered: %s,buffer); } else{ printf(Error\n); } return 0; }fgets与scanf的区别特性fgets()scanf(%s, str)读取终止条件遇到「换行符\n」「EOF」「n-1 个字符」停止遇到「空白字符空格 / 换行 / 制表符」停止是否保留终止符保留换行符\n存入缓冲区丢弃空白字符不存入缓冲区缓冲区溢出风险无指定最大读取长度有不检查长度可能溢出能否读带空格的字符串能比如读取 hello world不能只能读到第一个空格比如只读 hello返回值成功返回字符串地址失败返回 NULL返回成功读取的变量个数失败返回 EOF不同使用场景下该如何选择场景推荐用 fgets ()推荐用 scanf (% s)读取带空格的整行字符串如姓名、句子✅❌读取无空格的短字符串如账号、密码✅更安全❌有溢出风险追求绝对安全避免缓冲区溢出✅❌快速读取单个无空格字符串测试 / 小 demo❌✅临时用注意长度scanf补充知识格式符读取规则能否读空格适用场景%s从第一个非空白字符开始遇到空格 / 换行 / 制表符就停止❌ 不能读取无空格的单个单词%[^\n]读取所有字符直到遇到换行符\n才停止✅ 能读取整行文本含空格
输入输出函数
scanf与getchar的区别getchar() 是 “专精型” 函数只读取 1 个字符含空白常用于单个字符读取或清理缓冲区scanf() 是 “通用型” 函数支持多类型、多数据读取读取数值时自动跳过空白功能更强大唯一近似的场景scanf(%c, ch) 等价于 ch getchar()都读取单个字符包括空白但 scanf() 能做的远不止这些示例代码#include stdio.h int main() { // 1. 读取字符%c不跳过空白 printf(测试%c输入回车后按a\n); char ch1; scanf(%c, ch1); // 读取回车符\n printf(ch1%cASCII%d\n, ch1, ch1); // 2. 读取整数%d跳过空白 int num; printf(测试%d输入回车后按123\n); scanf(%d, num); // 跳过前面的空白读取123 printf(num%d\n, num); return 0; }fgets用法作用从指定的流stream中读取字符存入 str 数组直到遇到「换行符 \n」「文件结束 EOF」或「读满 n-1 个字符」为止最后自动在末尾加字符串结束符 \0。char *fgets(char *str, int n, FILE *stream);函数原型其中str是存放读取结果的字符数组缓冲区n是最多读取的字符数含\0 结束符stream是输入流文件 / 键盘示例代码#includestdio.h int main() { char buffer[10]; printf(enter a string(max 9):); if (fgets(buffer,10,stdin) ! NULL) { printf(You entered: %s,buffer); } else{ printf(Error\n); } return 0; }fgets与scanf的区别特性fgets()scanf(%s, str)读取终止条件遇到「换行符\n」「EOF」「n-1 个字符」停止遇到「空白字符空格 / 换行 / 制表符」停止是否保留终止符保留换行符\n存入缓冲区丢弃空白字符不存入缓冲区缓冲区溢出风险无指定最大读取长度有不检查长度可能溢出能否读带空格的字符串能比如读取 hello world不能只能读到第一个空格比如只读 hello返回值成功返回字符串地址失败返回 NULL返回成功读取的变量个数失败返回 EOF不同使用场景下该如何选择场景推荐用 fgets ()推荐用 scanf (% s)读取带空格的整行字符串如姓名、句子✅❌读取无空格的短字符串如账号、密码✅更安全❌有溢出风险追求绝对安全避免缓冲区溢出✅❌快速读取单个无空格字符串测试 / 小 demo❌✅临时用注意长度scanf补充知识格式符读取规则能否读空格适用场景%s从第一个非空白字符开始遇到空格 / 换行 / 制表符就停止❌ 不能读取无空格的单个单词%[^\n]读取所有字符直到遇到换行符\n才停止✅ 能读取整行文本含空格