为了账号安全,请及时绑定邮箱和手机立即绑定

扫描量的缺点

扫描量的缺点

C
尚方宝剑之说 2019-06-24 11:17:11
扫描量的缺点我想知道scanf().在许多网站上,我读到scanf可能导致缓冲区溢出。原因是什么?还有其他缺点吗?scanf?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

到目前为止,大多数答案似乎都集中在字符串缓冲区溢出问题上。实际上,可以使用的格式说明符scanf函数支持显式场宽设置,该设置限制输入的最大大小并防止缓冲区溢出。这使得人们普遍指责字符串缓冲区溢出在scanf几乎毫无根据。声称scanf在某种程度上类似于gets在这方面是完全不正确的。在质量上有一个很大的区别scanfgetsscanf为用户提供防止字符串缓冲区溢出的功能,而gets不会的。

可以说这些scanf功能很难使用,因为字段宽度必须嵌入到格式字符串中(无法通过变量参数传递它,这可以在printf)。这是真的。scanf在这方面确实设计得很差。但是任何声称scanf在字符串缓冲区溢出安全方面,不知何故被无可救药地破坏了,完全是假的,通常是懒惰的程序员造成的。

真正的问题是scanf有着完全不同的性质,尽管它也是关于溢流..什么时候scanf函数用于将数字的十进制表示转换为算术类型的值,不提供防止算术溢出的保护。如果发生溢出,scanf产生未定义的行为。因此,在C标准库中执行转换的唯一正确方法是strto...一家人。

所以,总结以上,问题在于scanf这是很难(尽管可能)正确和安全地使用字符串缓冲区。这是不可能安全使用的算术输入。后者才是真正的问题。前者只是一个不便之处。

P.S.上面的意思是关于…的整个家庭。scanf职能(也包括fscanfsscanf)。带着scanf具体来说,显而易见的问题是,使用严格格式化的函数进行潜在读取的想法。互动式输入是相当有问题的。


查看完整回答
反对 回复 2019-06-24
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

来自lang.c公司的常见问题:为什么大家都说不要用扫描呢?我应该用什么代替?

scanf有很多问题-见问题12.1712.18 a,和12.19..另外,%s格式也有同样的问题gets()有(见问题)12.23很难保证接收缓冲区不会溢出。[脚注]

更广泛地说,scanf是为相对结构化的格式化输入设计的(它的名称实际上是从“扫描格式化”派生出来的)。如果你注意,它会告诉你它是成功的还是失败的,但它只能告诉你它是在哪里失败的,而根本不知道它是如何或为什么失败的。您几乎没有机会进行任何错误恢复。

然而,交互式用户输入是最不结构化的输入。一个设计良好的用户界面将允许用户输入几乎任何东西-不仅仅是字母或标点符号(当数字被期望时),而且比预期的字符更多或更少,或者根本没有字符(E.,只是返回键),或过早的EOF,或任何东西。当使用scanf;读整行要容易得多(用fgets),然后用sscanf或者其他一些技巧。(功能如strtolstrtok,和atoi通常是有用的;参见12.1613.6)如果你真的使用任何scanf变量,请确保检查返回值,以确保找到了预期的项目数。另外,如果你用%s,确保防止缓冲区溢出。

请注意,顺便说一句,对.的批评scanf不一定要起诉fscanfsscanfscanf读自stdin,这通常是一个交互式键盘,因此是最小的限制,导致最多的问题。另一方面,当数据文件具有已知的格式时,使用fscanf..使用sscanf(只要检查了返回值),因为恢复控制非常容易,所以重新启动扫描,如果不匹配则丢弃输入,等等。

其他链接:

参考文献:K&R2,SEC.7.4第159页


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 397 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信