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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rocki 中级黑马   /  2014-7-13 10:28  /  2687 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码



9 个回复

倒序浏览
同样有这个疑问。
回复 使用道具 举报
幕夏 发表于 2014-7-13 11:13
同样有这个疑问。

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



回复 使用道具 举报
rocki 中级黑马 2014-7-13 14:57:10
7#
小海 发表于 2014-7-13 13:23
这个问题我也问过,得到的回答是:gets():当你输入的东西远比你定义时的长度,他还是会接收并写入空间。这 ...

那这个问题是怎么解决的呢 ?
回复 使用道具 举报
rocki 中级黑马 2014-7-13 14:58:12
8#
宋佳强 发表于 2014-7-13 14:31
看你的代码是要将一句话中的每个单词的首字母转成大写的意思。gets函数可以接收空格、tab等特殊字符,制造 ...

这个确实没考虑到。怎么才能解决呢?
回复 使用道具 举报
追马 中级黑马 2014-7-13 16:09:04
9#
使用gets()容易溢出。。。也就是输入的字符串大于数组的容量时字符串就溢出到其他存储空间了。
gets()没有边界检查,貌似有些大神可以利用gets不检查边界的特性,用输入实现攻击。
所以xcode提示不安全。
回复 使用道具 举报
没有边界检查可能越界读取内存。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马