黑马程序员技术交流社区

标题: gets()函数使用老是报错警告?求代替或解决办法 [打印本页]

作者: wanjiadenghuo    时间: 2015-5-7 23:27
标题: gets()函数使用老是报错警告?求代替或解决办法
include <stdio.h>
int main()
{
    printf("请输入一英文句子:\n");
   
    char a[100];
    char *p = a;
    gets(a);
   
    if(*p != ' '&& *p >='a' && *p <='z' )  //如果不为空格且是小写
    {
        *p -= 32;
        p++;
    }
    else if(*p != ' '&& *p >='A' && *p <='Z') // 如果不为空格且是大写
    {
        p++;
    }
    else if(*p == ' ')  // 如果为空格
    {
        p++;
    }
    while(*p != '\0')  //循环直到遇到\0
    {
        
        if(*p != ' ')  //如果不为空格就继续判断
        {
            p++;
        }
        else if(*p == ' ')  //如果检测到了空格就使下一个字母变为大写
        {
            p++;
            if(*p >='a' && *p <='z' )
                *p -= 32;
        }
    }
   
    puts(a);  //输出a
   
    return 0;
}

运行就回报错:warning:this program uses gets(),which is unsafe 具体解决方案或代替此输入字符串函数方法
作者: cui0wei0    时间: 2015-5-8 00:17
gets函数不安全, 不要用这个函数就好了, 换个别的
作者: wanjiadenghuo    时间: 2015-5-8 00:26
cui0wei0 发表于 2015-5-8 00:17
gets函数不安全, 不要用这个函数就好了, 换个别的

那换用哪个函数或解决办法
作者: cui0wei0    时间: 2015-5-8 00:31
wanjiadenghuo 发表于 2015-5-8 00:26
那换用哪个函数或解决办法

gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()

百度知道,我都知道
作者: 50mmf1.0    时间: 2015-5-8 00:34
不要用gets,用scanf函数
作者: ydy96315    时间: 2015-5-8 05:59
get老师视频里面有没有讲过啊,我好像没有看到啊
作者: wangzhewjl    时间: 2015-5-8 09:00
老师讲的scanf函数 gets没有讲。




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