黑马程序员技术交流社区

标题: 关于gets函数的问题。 [打印本页]

作者: rocki    时间: 2014-7-13 10:28
标题: 关于gets函数的问题。
本帖最后由 rocki 于 2014-7-13 14:53 编辑

我写了一段程序,里面用了gets 函数。然后Xcode给了我一个警告。this program use gets(),which is unsafe .  为什么给我这个警告。。程序用这个函数为什么不安全?求解。下面是我写那个程序的源代码
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {
  4.     void transition(char *p);//声明转换函数
  5.    
  6.     char c[100];//存储用户输入字符串
  7.    
  8.     printf("请输入英文单词或句子\n");//提示用户输入
  9.    
  10.     gets(c);//接收用户输入字符串
  11.         
  12.     transition(c);//调用转换函数
  13.    
  14.     return 0;
  15. }
  16. void transition(char *p)
  17. {
  18.     int i;//用于控制循环
  19.    
  20.     p[0]=p[0]-32;//第一位转换成大写
  21.         
  22.     for (i=1;p[i]!='\0';i++)//检测字符串结束标记
  23.         {
  24.                 if (p[i-1]==' ')//如果第i-1位为空格,则将第i位改成大写
  25.                 {
  26.                         p[i]=p[i]-32;
  27.                 }
  28.         }
  29.         
  30.     for (i=0;p[i]!='\0';i++)// 输出字符串
  31.         {
  32.         printf("%c",*(p+i));
  33.         }
  34.         printf("\n");
  35. }
复制代码




作者: 幕夏    时间: 2014-7-13 11:13
同样有这个疑问。
作者: rocki    时间: 2014-7-13 12:49
幕夏 发表于 2014-7-13 11:13
同样有这个疑问。

我一发帖就没啥人理我。。。估计咱俩这个疑问可能一时半会解决不了。
作者: 小海    时间: 2014-7-13 13:23
这个问题我也问过,得到的回答是:gets():当你输入的东西远比你定义时的长度,他还是会接收并写入空间。这样就溢出了,覆盖掉后面的相应空间。这样就会不安全
作者: zhs    时间: 2014-7-13 14:18
函数gets的原型为:char*gets(char*buffer);
gets()函数用来从标准输入设备(键盘)读取字符串直至接受到换行符或EOF时停止结束,并将读取的结果存放在buffer指针所指向的字符数组中,但换行符会被丢弃,然后在末尾添加'\0'字符。
通过函数原型可以得知,gets函数的形参为char * buffer字符串指针,所以在从键盘接收时是没有越界这一情况的,而你程序中是用字符串数组存储的,这会有越界情况。
综上所述:程序运行后不管输入多少字符都会正常接收,但存储输出的话就可能出现异常
作者: 宋佳强    时间: 2014-7-13 14:31
看你的代码是要将一句话中的每个单词的首字母转成大写的意思。gets函数可以接收空格、tab等特殊字符,制造垃圾,所以不安全。
另外,就你的程序而言,如果用户连续输入多个空格或者tab,你的程序就出问题了




作者: rocki    时间: 2014-7-13 14:57
小海 发表于 2014-7-13 13:23
这个问题我也问过,得到的回答是:gets():当你输入的东西远比你定义时的长度,他还是会接收并写入空间。这 ...

那这个问题是怎么解决的呢 ?
作者: rocki    时间: 2014-7-13 14:58
宋佳强 发表于 2014-7-13 14:31
看你的代码是要将一句话中的每个单词的首字母转成大写的意思。gets函数可以接收空格、tab等特殊字符,制造 ...

这个确实没考虑到。怎么才能解决呢?
作者: 追马    时间: 2014-7-13 16:09
使用gets()容易溢出。。。也就是输入的字符串大于数组的容量时字符串就溢出到其他存储空间了。
gets()没有边界检查,貌似有些大神可以利用gets不检查边界的特性,用输入实现攻击。
所以xcode提示不安全。

作者: Devchen    时间: 2014-7-13 17:23
没有边界检查可能越界读取内存。




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