黑马程序员技术交流社区

标题: 程序纠错问题:gets不安全 [打印本页]

作者: 董月峰    时间: 2014-3-18 11:08
标题: 程序纠错问题:gets不安全
本帖最后由 董月峰 于 2014-3-24 14:50 编辑

/*
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/

#include<stdio.h>

int main()
{
    //定义并初始化整形len,maxlen
    int len = 0,maxlen = 0;
    //以及要用到的指针和字符串数组s【】,单词的s1【】
    char *p,*p1,s[1024],s1[64];
    //输入字符串提示用户输入
    printf("请输入一句只含字母和空格的英文");
    //获取字符串
    gets(s);
    //利用指针遍历字符串
    for(p1 = s; *p1 != '\0'; p1++)
    {
        //没遇到空格,单词长度len就增1
        if(*p1 != ' ')
            len++;
        //遇到空格时
        else
        {
            //取最长单词的数为maxlen,后面遇到len比maxlen大,就互换
           if(len > maxlen)
           {
               maxlen = len;
               //这是为了找出并标记最长单词在内存初位置方便后面遍历输出
               p = p1 - len;
               //计算下一个单词长度前len重新赋值0
               len = 0;
           }
        }
    }
    //遍历出最长的单词s1
    for(int i = 0;i < maxlen;i++)
    {
        s1 = *(p + i);
    }
    //字符串最后是个‘0’;
    s1[maxlen] = '\0';
    //输出得到结果
    printf("句中最长单词是:%s\n",s1);

    return 0;
}

//
求助:1.看测试题这个格式可以吗?解释有哪些不完全的地方请指出
         2.xcode报错说输出英文句子的gets不安全
注:在cfree上没事,但是xcode说gets不安全,求大神帮忙

作者: keycola    时间: 2014-3-18 11:29
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/


不知到,兄台是不是想试试指针才这么写的,题目没有要求, 感觉那两个指针有点多余,不过程序运行是没问题的。

char *p = null, *p1 = null, s[1024] = "", s1[64] = "";   定义时候初始化一下好点

程序运行没问题,gets报的是警告吗
gets 的安全问题,在于里面定义了多少空间
s[1024] ,如果兄台输入超过 1024个char ,那么可能会出现写入内存时候出错,所以在不能控制用户输入多少个的情况下,就有的不安全。


作者: apple_victor    时间: 2014-3-18 16:13
gets()函数可以无限读取,不会判断上限,但是应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。所有此函数如果buffer空间太小,就会发生溢出,所有它是不安全的,故而应该仔细判断,后使用

作者: 董月峰    时间: 2014-3-24 14:49
/*
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/

#include<stdio.h>

int main()
{
    //定义并初始化整形len,maxlen
    int len = 0, maxlen = 0, wordnum = 0;
    //以及要用到的指针和字符串数组s【】,单词的s1【】
    char *p,*p1,s[1024],s1[64];
    //输入字符串提示用户输入
    printf("请输入一句只含字母和空格的英文");
    //获取字符串
    gets(s);
    //利用指针遍历字符串
    for(p1 = s; *p1 != '\0'; p1++)
    {
        //没遇到空格,单词长度len就增1
        if(*p1 != ' ')
            len++;
        //遇到空格时
        else
        {
            wordnum = wordnum + 1;
            //取最长单词的数为maxlen,后面遇到len比maxlen大,就互换
           if(len > maxlen)
           {
               maxlen = len;
               //这是为了找出并标记最长单词在内存初位置方便后面遍历输出
               p = p1 - len;
               //计算下一个单词长度前len重新赋值0
               len = 0;
           }
        }
    }
    if(wordnum == 0)
        printf("只输入了1个单词%s,它本身就是最长的",s);
    else
    {
        //遍历出最长的单词s1
        for(int i = 0;i < maxlen;i++)
        {
            s1[i] = *(p + i);
        }
        //字符串最后是个‘0’;
        s1[maxlen] = '\0';
        //输出得到结果
        printf("句中最长单词是:%s\n",s1);

    }
     return 0;
}//ps   本人的程序因为没考虑只有一个单词的情况,老师给判0分,现在补上修改代码如上,以免误导后人
作者: 愿我能    时间: 2014-3-30 13:03
当时这道题没有做出来,经验收下了.
作者: haohaoxuexi    时间: 2014-3-30 20:16
我的也是,在vc上没报错,但是在Xcode上显示警告




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