黑马程序员技术交流社区

标题: gets(),scanf(),getchar()三者的区别 [打印本页]

作者: 执着的土豆    时间: 2014-4-21 16:45
标题: gets(),scanf(),getchar()三者的区别
本帖最后由 执着的土豆 于 2014-4-21 22:00 编辑

    用gets()每次都会提示warning: this program uses gets(), which is unsafe.

gets(),getchar(),scanf()() 这三种输入方法的区别。

作者: 执着的土豆    时间: 2014-4-21 16:48
网上查找资料,有人说:get(),没有边界检查, 深入了解计算机的人可以利用gets不检查边界, 用输入实现攻击 所以不安全。但是我想便利一个从键盘输入的字符串(长度未知),直到遇到\0结束遍历。用其他的两种怎么做?
作者: 葬花桥    时间: 2014-4-21 19:24
楼主是想输入一个包含空格的字符串吧?除了用gets以外,可以用scanf的格式化输入,scanf("%[^\n]",str); [^\n]是自定义的一个结束标志,scanf遇到\n就会返回,而不是遇到空格也返回,类似的scanf格式化输入还有很多其它的,建议楼主百度下,这些是书上没看到过的。
作者: 又召    时间: 2014-4-21 20:55
因为使用gets()容易溢出,也就是输入的字符串大于你自己定义的数组容量时,字符串就溢出到其他存储空间了,这是很危险的,所以会有警告!还有我不知道你要用遍历是想干嘛?如果你要是想用其他方法实现输入的话,scanf()是不能遇到空格的,遇到空格就结束,而getchar是一次输入一个字符,你要是用getchar(),你可以先定义一个比较大的数组,让后在for循环里面输入(不过输入的时候很麻烦),再加上一个if(a[i]=='\0')的判断语句,遇到就跳出循环。
作者: 执着的土豆    时间: 2014-4-21 21:47
又召 发表于 2014-4-21 20:55
因为使用gets()容易溢出,也就是输入的字符串大于你自己定义的数组容量时,字符串就溢出到其他存储空间了, ...

   哦,我明白了。 就是对这几个写入的容易混淆。 刚才试了一下,最后用scanf如下遍历字符串中的每个元素。
   scanf("%s",str);
    for(n=0;str[n]!='\0';++n)

非常感谢!
作者: 执着的土豆    时间: 2014-4-21 21:51
葬花桥 发表于 2014-4-21 19:24
楼主是想输入一个包含空格的字符串吧?除了用gets以外,可以用scanf的格式化输入,scanf("%[^\n]",str); [^\ ...

谢谢,你的方法刚才试了一下,很好用,学习了。谢谢! 我是搞不明白三种输入方式的区别,有时候会报错。 不过已经明白了,还要以后多练习下。  谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2