scanf的安全输入问题

本文讨论了华为面试中一道关于C语言输入的问题,指出使用scanf可能导致数组溢出,分析了内存中变量的存储情况,并提出了使用fgets作为更安全的输入方法。通过对越界输入的解释,强调了防止缓冲区溢出的重要性。
摘要由CSDN通过智能技术生成

引入:华为的一道经典面试

这里写图片描述

用老师的话说,如果你脱口而出答案是5,那么你连C语言们都还没摸到,眼尖的同学会看出数组溢出了,但至于结果怎么算却搞不明白。至于大神吗,分分钟得出答案。好了别的不多扯,我们看看这个到底怎么算。
结果:i=6776421
进入到内存中分析:
连续定义的变量,内存地址一般也相邻
首先依次在栈区为变量开辟空间(注意方式,整形是4个字节以计算,char型一字节一计算)
这里写图片描述

越界后

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C语言中,scanf函数是用来从标准输入(通常是键盘)读取输入数据的函数。在使用scanf函数时,有一些注意事项需要注意: 1. 格式化字符串:scanf函数使用格式化字符串来指定输入的数据类型和格式。在格式化字符串中,需要使用特定的格式控制符来匹配输入数据的类型,如"%d"表示整数,"%f"表示浮点数,"%c"表示字符等。 2. 输入数据的匹配:scanf函数会按照格式化字符串中的格式控制符顺序读取输入数据。输入数据的类型和格式必须与格式化字符串中的格式控制符匹配,否则可能导致错误的结果或程序崩溃。 3. 输入缓冲区:scanf函数会将读取到的数据存储到输入缓冲区中,然后再将其赋值给相应的变量。如果输入缓冲区中还有未读取的数据,scanf函数会直接使用这些数据而不会等待用户输入。因此,在使用scanf函数之前,应该清空输入缓冲区中的残留数据,可以使用fflush(stdin)或者getchar()来清空输入缓冲区。 4. 错误处理:scanf函数返回值为成功读取的参数个数。如果成功读取了所有参数,则返回参数个数;如果读取失败或者遇到文件结束符,则返回EOF(-1)。因此,在使用scanf函数后应该检查其返回值,以判断输入是否成功。 5. 输入安全性:scanf函数存在输入溢出的风险,即输入数据超过了变量的存储空间。为了避免这种情况,可以使用限定符(如"%ns")来限制输入字符串的长度,或者使用fgets函数来读取字符串。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值