A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执着的土豆 中级黑马   /  2014-4-21 16:45  /  1450 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 执着的土豆 于 2014-4-21 22:00 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
又召 发表于 2014-4-21 20:55
因为使用gets()容易溢出,也就是输入的字符串大于你自己定义的数组容量时,字符串就溢出到其他存储空间了, ...

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

非常感谢!
回复 使用道具 举报
葬花桥 发表于 2014-4-21 19:24
楼主是想输入一个包含空格的字符串吧?除了用gets以外,可以用scanf的格式化输入,scanf("%[^\n]",str); [^\ ...

谢谢,你的方法刚才试了一下,很好用,学习了。谢谢! 我是搞不明白三种输入方式的区别,有时候会报错。 不过已经明白了,还要以后多练习下。  谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马