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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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 具体解决方案或代替此输入字符串函数方法

6 个回复

倒序浏览
gets函数不安全, 不要用这个函数就好了, 换个别的
回复 使用道具 举报
cui0wei0 发表于 2015-5-8 00:17
gets函数不安全, 不要用这个函数就好了, 换个别的

那换用哪个函数或解决办法
回复 使用道具 举报
wanjiadenghuo 发表于 2015-5-8 00:26
那换用哪个函数或解决办法

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

百度知道,我都知道
回复 使用道具 举报
不要用gets,用scanf函数
回复 使用道具 举报
get老师视频里面有没有讲过啊,我好像没有看到啊
回复 使用道具 举报
老师讲的scanf函数 gets没有讲。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马