尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Day1语法:printf 与 scanf 使用

Day1语法:printf 与 scanf 使用 1. 输入输出函数printf 和 scanf 是 C 语言中最常用的格式化输入输出函数但使用不当可能导致未定义行为或缓冲区溢出。本文梳理了它们的使用细节、常见错误及最佳实践并补充了 getchar/putchar、fgets/fputs 等辅助函数帮助你安全地进行输入输出操作。2. printf 使用细节2.1 基本语法函数原型int printf(const char *format, ...);作用格式化输出到标准输出屏幕。返回值成功时返回打印的字符数失败时返回负值。2.2 输出缓冲区printf 输出时会先存入输出缓冲区遇到以下情况才刷新到屏幕缓冲区已满遇到换行符\n程序正常结束显式调用fflush(stdout)示例printf(Hello); // 存储在缓冲区不立即显示 printf( World\n); // 遇到 \n缓冲区刷新显示 Hello World2.3 常见格式控制符格式符说明示例%d十进制整数printf(%d, 42);%u无符号十进制整数printf(%u, 100u);%f浮点数默认6位小数printf(%f, 3.14);%.2f保留2位小数printf(%.2f, 3.14);%c单个字符printf(%c, A);%s字符串printf(%s, Hi);%x十六进制小写printf(%x, 255);%X十六进制大写printf(%X, 255);%p指针地址printf(%p, x);%%打印%本身printf(%%);2.4 宽度与精度控制%5d至少占5个字符宽度右对齐。%-5d左对齐。%.3f保留3位小数。printf(%5d, 10); // 输出 10 printf(%-5d, 10); // 输出 10 printf(%.3f, 3.14159);// 输出 3.1422.5 转义字符\n换行\t制表符\\打印反斜杠\打印双引号2.6 类型匹配格式符必须与变量类型严格匹配否则引发未定义行为。例如用%d打印float是错误的float f 3.14; printf(%d, f); // 错误应使用 %f3. scanf 使用细节3.1 基本语法函数原型int scanf(const char *format, ...);作用从标准输入读取格式化数据。返回值成功读取的变量个数失败或遇到 EOF 返回 -1。3.2 输入缓冲区用户输入的数据首先进入输入缓冲区scanf 从缓冲区读取并解析未处理的数据会残留。3.3 常见格式控制符格式符说明示例%d读取整数scanf(%d, num);%f读取floatscanf(%f, fval);%lf读取doublescanf(%lf, dval);%c读取字符含空格scanf(%c, ch);%s读取字符串无空格scanf(%s, str);%[^\n]读取一行含空格scanf(%[^\n], line);3.4 关键细节3.4.1 必须传递变量地址除字符串字符数组外其他变量必须加。int num; scanf(%d, num); // 错误应写成 scanf(%d, num);3.4.2 缓冲区残留问题scanf 读取后输入缓冲区可能残留\n影响后续输入。可通过以下方式清空while (getchar() ! \n); // 清空缓冲区3.4.3 防止 %s 缓冲区溢出scanf(%s, str)不检查长度可能导致越界。建议限制读取长度char str[100]; scanf(%99s, str); // 最多读取 99 个字符留 1 位给 \03.4.4 %c 会读取空白字符如果前面有\n%c会直接读取它。解决方法是在%c前加空格scanf( %c, ch); // 跳过空白字符3.4.5 检查返回值始终检查输入是否成功避免非法输入导致程序崩溃if (scanf(%d, num) ! 1) { printf(输入错误\n); while (getchar() ! \n); // 清空缓冲区 }4. printf 与 scanf 对比特性printfscanf用途输出数据输入数据变量传递直接传值必须传地址缓冲区通常自动刷新带 \n可能残留 \n需清理安全性一般安全%s 可能溢出需限制长度返回值成功打印的字符数成功读取的变量个数5. 经典错误示例5.1 scanf 忘记 int num; scanf(%d, num); // 错误导致未定义行为5.2 %d 读取 floatfloat f; scanf(%d, f); // 错误应使用 %f5.3 %s 不限制长度char name[10]; scanf(%s, name); // 输入超过 9 个字符导致缓冲区溢出正确做法scanf(%9s, name);5.4 scanf 读取整数时的残留字符scanf 根据%d读取整数遇到非数字字符会停止并将该字符放回缓冲区影响后续读取。scanf(%d%d, a, b); scanf(%c, c); // 若输入字母 ac 会直接获取该字符6. 最佳实践6.1 printf使用\n确保输出刷新。确保格式符与变量类型匹配。合理控制输出宽度和精度。6.2 scanf始终检查返回值。对%s使用长度限制。必要时清空输入缓冲区。7. 其他相关函数7.1 getchar 与 putchargetchar()从标准输入读取一个字符putchar()输出一个字符。char ch getchar(); // 等价于 scanf(%c, ch); putchar(ch); // 等价于 printf(%c, ch);7.2 getc 与 putc与 getchar/putchar 类似但允许指定文件指针如stdin、stdout或自定义文件流。ch getc(stdin); // 从标准输入读取 ch getc(fp); // 从文件指针 fp 读取7.3 fgets 与 fputsfgets从指定流读取一行通过第二个参数限制长度安全解决溢出问题。char ch[20]; fgets(ch, 19, stdin); // 最多读取 19 个字符保留 \0 printf(%s, ch);fputs将字符串写入指定流不自动添加换行符。fputs(buf, fp); // 将 buf 写入 fp 指向的文件8. 总结掌握 printf 和 scanf 的细节能有效避免未定义行为和缓冲区溢出。关键点printf 注意格式匹配和缓冲区刷新scanf 必须传地址限制字符串长度检查返回值清理残留缓冲区必要时使用 getchar/putchar、fgets/fputs 等更安全的函数替代。希望笔记能帮助你巩固 C 语言输入输出相关知识减少编码中的低级错误。
返回列表