猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
扫描量的缺点
扫描量的缺点
我想知道
scanf()
.
在许多网站上,我读到
scanf
可能导致缓冲区溢出。原因是什么?还有其他缺点吗?
scanf
?
尚方宝剑之说
浏览 398
回答 3
3回答
吃鸡游戏
到目前为止,大多数答案似乎都集中在字符串缓冲区溢出问题上。实际上,可以使用的格式说明符scanf函数支持显式场宽设置,该设置限制输入的最大大小并防止缓冲区溢出。这使得人们普遍指责字符串缓冲区溢出在scanf几乎毫无根据。声称scanf在某种程度上类似于gets在这方面是完全不正确的。在质量上有一个很大的区别scanf和gets: scanf为用户提供防止字符串缓冲区溢出的功能,而gets不会的。可以说这些scanf功能很难使用,因为字段宽度必须嵌入到格式字符串中(无法通过变量参数传递它,这可以在printf)。这是真的。scanf在这方面确实设计得很差。但是任何声称scanf在字符串缓冲区溢出安全方面,不知何故被无可救药地破坏了,完全是假的,通常是懒惰的程序员造成的。真正的问题是scanf有着完全不同的性质,尽管它也是关于溢流..什么时候scanf函数用于将数字的十进制表示转换为算术类型的值,不提供防止算术溢出的保护。如果发生溢出,scanf产生未定义的行为。因此,在C标准库中执行转换的唯一正确方法是strto...一家人。所以,总结以上,问题在于scanf这是很难(尽管可能)正确和安全地使用字符串缓冲区。这是不可能安全使用的算术输入。后者才是真正的问题。前者只是一个不便之处。P.S.上面的意思是关于…的整个家庭。scanf职能(也包括fscanf和sscanf)。带着scanf具体来说,显而易见的问题是,使用严格格式化的函数进行潜在读取的想法。互动式输入是相当有问题的。
0
0
0
慕桂英4014372
来自lang.c公司的常见问题:为什么大家都说不要用扫描呢?我应该用什么代替?scanf有很多问题-见问题12.17, 12.18 a,和12.19..另外,%s格式也有同样的问题gets()有(见问题)12.23很难保证接收缓冲区不会溢出。[脚注]更广泛地说,scanf是为相对结构化的格式化输入设计的(它的名称实际上是从“扫描格式化”派生出来的)。如果你注意,它会告诉你它是成功的还是失败的,但它只能告诉你它是在哪里失败的,而根本不知道它是如何或为什么失败的。您几乎没有机会进行任何错误恢复。然而,交互式用户输入是最不结构化的输入。一个设计良好的用户界面将允许用户输入几乎任何东西-不仅仅是字母或标点符号(当数字被期望时),而且比预期的字符更多或更少,或者根本没有字符(E.,只是返回键),或过早的EOF,或任何东西。当使用scanf;读整行要容易得多(用fgets),然后用sscanf或者其他一些技巧。(功能如strtol, strtok,和atoi通常是有用的;参见12.16和13.6)如果你真的使用任何scanf变量,请确保检查返回值,以确保找到了预期的项目数。另外,如果你用%s,确保防止缓冲区溢出。请注意,顺便说一句,对.的批评scanf不一定要起诉fscanf和sscanf. scanf读自stdin,这通常是一个交互式键盘,因此是最小的限制,导致最多的问题。另一方面,当数据文件具有已知的格式时,使用fscanf..使用sscanf(只要检查了返回值),因为恢复控制非常容易,所以重新启动扫描,如果不匹配则丢弃输入,等等。其他链接:克里斯·托雷克更详细的解释你的更长时间的解释参考文献:K&R2,SEC.7.4第159页
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
C
typedef入门问题
1 回答
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续