当前位置: 首页 > news >正文

避雷 :C语言中 scanf() 函数的错误❌使用!!!

1. 返回值说明

scanf函数会返回成功匹配并赋值的输入项个数,而不是返回输入的数据

可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。

#include <stdio.h>int main() {int num;if (scanf("%d", &num) != 1) {  //1是指scanf 函数返回成功匹配并赋值的输入项个数printf("输入无效,请输入一个整数。\n");return 1;}printf("你输入的整数是: %d\n", num);return 0;
}
}

2. 地址传递

给 scanf 函数传递变量时,要传递变量的地址(即使用 & 运算符),这样 scanf 才能把输入的值存储到变量所在的内存位置。

#include <stdio.h>int main() {int num;// 正确用法scanf("%d", &num);// 错误用法:scanf("%d", num); return 0;
}

3. 输入缓存区问题

scanf 读取输入后,输入缓冲区可能会残留一些字符(如用户输入了回车->换行符 \n),这可能会对后续的输入操作产生影响。

#include <stdio.h>int main() {int num;char ch;scanf("%d", &num);  //这里模拟用户输入整数后还按了回车getchar();   // 消耗掉输入缓冲区的换行符/*
当用户输入整数并按下回车键时,回车键产生的换行符 \n 会留在输入缓冲区里。
若不把这个换行符消耗掉,后续的 scanf("%c", &ch); 就会读取到这个换行符,而非用户输入的字符。
getchar() 函数的作用就是从输入缓冲区读取一个字符,这里它读取的就是换行符。*/scanf("%c", &ch);  //&ch 表示把用户输入的字符存到 ch 变量的内存地址中。return 0;
}

4. 格式控制字符串

(1)匹配输入

格式控制字符串要和输入的数据类型相匹配。例如,读取整数用 %d,读取浮点数用 %f 等。

#include <stdio.h>int main() {int num;float f;scanf("%d", &num);scanf("%f", &f);return 0;
}
(2)空格和特殊字符

格式控制字符串里的空格、制表符和换行符会匹配输入中的任意空白字符序列。其他非格式说明符的字符必须和输入中的字符精确匹配。

#include <stdio.h>int main() {int a, b;// 输入时需要输入 a=1 b=2 这样的格式scanf("a=%d b=%d", &a, &b); 
/*
注意如果平时只需要输入一个值,则后面不要加空格。
即:scanf("%d ", &a);  这种写法是❌错误的
*/return 0;
}

5. 防止缓冲区溢出

使用 scanf 读取字符串时(%s),要留意防止缓冲区溢出。可以使用宽度限定符来限制读取的字符数量。

#include <stdio.h>#define MAX_LENGTH 10int main() {char str[MAX_LENGTH];// 最多读取 MAX_LENGTH - 1 个字符,为字符串结束符 '\0' 留位置scanf("%9s", str); return 0;
}

6. 不同类型的混合使用

要注意输入格式和顺序,防止出现意外结果。

#include <stdio.h>int main() {int num;char str[10];// 先输入整数,再输入字符串scanf("%d %s", &num, str); return 0;
}

7. 错误处理

scanf 函数可能会因为输入不匹配、文件结束等原因失败,要对这些情况进行适当的错误处理。

#include <stdio.h>int main() {int num;if (scanf("%d", &num) != 1) {if (feof(stdin)) {printf("输入结束。\n");} else {printf("输入错误。\n");}return 1;}return 0;
}

 因为今天又在scanf函数上栽了跟头,所以今天终于决定将scanf容易踩的抗自我做一个总结。以上是自己结合AI还有自己的一些理解写的一些总结。如果有不足处,欢迎评论区指出,如果对你有帮助,那可以给我一个👍赞吗


http://www.mrgr.cn/news/95644.html

相关文章:

  • (Linux操作系统)进程状态
  • Vue.js 应用的入口文件main.js
  • C++学习之云盘上传文件列表下载
  • python 学习基本语法整理
  • 介绍一款基于MinerU的PDF翻译工具
  • Qt开发:QComboBox的使用
  • AI知识补全(一):tokens是什么?
  • go中的文件、目录的操作
  • 多阶段构建实现 Docker 加速与体积减小:含文件查看、上传及拷贝功能的 FastAPI 应用镜像构建
  • 【STM32】SPI通信外设硬件SPI读写W25Q64
  • Nginx请求头Hos头攻击
  • Ubuntu20.04安装并配置Pycharm2020.2.5
  • C++模板编程与元编程面试题及参考答案(精选100道题)
  • 车道保持中车道线识别
  • 圆弧插补相关算法汇总(C++和ST源代码)
  • 银河麒麟桌面版包管理器(四)
  • 银河麒麟桌面版包管理器(五)
  • 如何解决微服务调用链性能问题(优化 JVM 配置,降低 Full GC 频率)
  • 虚幻基础:UI
  • 论文阅读笔记:Denoising Diffusion Probabilistic Models (3)