C语言学习笔记 - 41.数据类型 - scanf函数核心知识点复习
本知识点对应谭浩强《C程序设计(第五版)》第3章3.4.4节“用scanf函数输入数据”的综合复习是C语言用户交互功能的核心基础。scanf与printf是一对功能互补的标准输入输出函数掌握scanf的正确用法是编写健壮交互程序的前提。1. scanf函数的核心功能scanf函数的本质将用户从键盘输入的字符序列按照指定格式转换为对应类型的数据并存入指定变量的内存地址中。它与printf函数功能完全对应printf将变量的内容从内存输出到显示器scanf将用户输入的数据从键盘存入内存变量2. scanf的两种基本用法2.1 用法一仅包含输入控制符推荐格式字符串中只包含输入控制符这是最常用、最不易出错的用法。语法scanf(输入控制符, 变量名);示例#include stdio.h int main() { int i; char ch; float f; scanf(%d, i); // 输入整数 scanf(%c, ch); // 输入单个字符 scanf(%f, f); // 输入单精度浮点数 return 0; }2.2 用法二包含非输入控制符不推荐格式字符串中同时包含输入控制符和非输入控制符。核心规则非输入控制符必须被用户原样输入否则会导致输入失败。示例#include stdio.h int main() { int i; scanf(m%d, i); // 非输入控制符m必须被原样输入 printf(i %d\n, i); return 0; }输入要求用户必须输入m123才能正确赋值直接输入123会失败。强烈不推荐的原因增加用户输入难度容易出错降低程序健壮性任何格式偏差都会导致输入失败替代方案使用printf函数输出提示信息明确告知用户输入格式3. 输入控制符的核心作用3.1 为什么必须使用输入控制符关键事实从键盘输入的所有内容本质上都是字符而不是数字。例如用户输入123时操作系统接收到的是三个独立的字符‘1’(ASCII 49)、‘2’(ASCII 50)、‘3’(ASCII 51)。输入控制符的作用就是告诉scanf如何将这些字符转换为对应类型的数据。输入控制符转换规则%d将数字字符序列转换为十进制整数%c直接读取单个字符不进行转换%f将数字字符序列转换为单精度浮点数3.2 常用输入控制符scanf的输入控制符与printf的输出控制符完全一致输入控制符含义适用数据类型%d输入十进制有符号整数int%ld输入十进制有符号长整数long int%c输入单个字符char%f输入单精度浮点数float%lf输入双精度浮点数double3.3 取地址符的必要性所有输入参数必须是变量的地址即变量名前必须加取地址符scanf需要知道变量的内存地址才能将转换后的数据存入正确的位置忘记加是初学者最常见的严重错误会导致程序崩溃或产生不可预知的结果4. scanf的输入解析逻辑scanf函数按照以下严格规则解析用户输入从输入缓冲区中逐个读取字符跳过前导空白字符空格、制表符、回车符读取符合输入控制符要求的字符直到遇到不符合要求的字符为止将读取到的字符序列转换为对应类型的数据将转换后的数据存入指定变量未读取的字符包括非法字符会留在输入缓冲区中下一次调用scanf时会从上次停止的位置继续读取4.1 示例解析#include stdio.h int main() { int i, j; printf(请输入第一个整数); scanf(%d, i); // 假设用户输入89m printf(请输入第二个整数); scanf(%d, j); // 这行代码会直接失败 printf(i %d, j %d\n, i, j); return 0; }执行过程用户输入89m并按下回车键第一个scanf读取字符‘8’和‘9’转换为整数89存入变量i遇到非法字符‘m’停止解析‘m’被留在输入缓冲区中第二个scanf从输入缓冲区中读取到‘m’无法转换为整数直接失败变量j被赋予随机垃圾值结论一个地方的输入错误会导致后续所有scanf语句失败这是初学者最容易遇到的陷阱之一。5. 多变量输入的最佳实践5.1 推荐用法使用默认空白分隔符多个输入控制符之间不添加任何非输入控制符使用默认的空白字符空格、回车、制表符作为分隔符。示例#include stdio.h int main() { int i, j; printf(请输入两个整数用空格分隔); scanf(%d%d, i, j); // 两个%d之间没有任何字符 printf(i %d, j %d\n, i, j); return 0; }合法输入方式12 34空格分隔12\n34回车分隔12\t34制表符分隔5.2 不推荐用法使用逗号等非输入控制符scanf(%d,%d, i, j); // 不推荐用户必须严格输入12,34才能正确赋值输入12 34会导致第二个变量赋值失败。5.3 绝对禁止在格式字符串末尾添加\nscanf(%d\n, i); // 严重错误会导致程序卡住用户必须输入任意字符并再次按下回车键才能继续执行。6. 编程规范与常见问题使用scanf前必须加printf提示信息明确告知用户输入格式和要求尽量避免使用非输入控制符所有格式提示都通过printf输出每个变量前必须单独添加取地址符非法输入处理可以通过循环清除输入缓冲区中的垃圾字符解决输入错误的连锁反应问题。该功能依赖while循环将在第5章流程控制中详细讲解。7. 要点总结核心功能将键盘输入的字符转换为指定格式的数据存入变量中两种用法仅含输入控制符推荐和包含非输入控制符不推荐控制符作用必须使用输入控制符因为键盘输入的本质是字符需要转换为对应类型的数据取地址符所有输入参数必须是变量的地址变量名前必须加解析逻辑遇到非法字符会停止解析未读取的字符会留在输入缓冲区中影响后续输入多变量输入推荐使用默认空白分隔符不要使用逗号等非输入控制符绝对禁止不要在scanf格式字符串末尾添加\n编程规范使用scanf前必须用printf输出提示信息提高程序的用户体验