首页 > 其他分享 >在C语言中如何去掉gets的警告

在C语言中如何去掉gets的警告

时间:2025-01-16 11:29:43浏览次数:3  
标签:字符 ch str1 C语言 警告 gets 去掉 输入

在C语言中使用gets会出现下面的警告,意思是:“警告:‘ gets’函数是危险的,不应该使用。”

 warning: the `gets' function is dangerous and should not be used.

这是因为gets没有限制输入字符串的长短,如果输入字符过长,就会发生越界。产生潜在的危险。

为了避免这种警告,在菜鸟教程(https://www.runoob.com/)中搜索 “C库函数-gets”,可以看见如下描述

也就是gets()获取了输入字符,存到给定的地址里面,到换行符时候截止,因此我们可以模拟一个gets()函数,并且加一个条件,如果越界了就停止获取输入字符代码如下。

    //获取输入的一行字符存入str1
    while(1)
    {
        scanf("%c",&ch);

        if('\n' == ch)

        {
            str1[i] = '\0';
            break;
        }
        else
        {
            str1[i] = ch;
            i++;
        }

        if(sizeof(str1)-1 <= i)
        {
            printf("输入字符数达到上限\n");
            break;//防止越界
        }
    }

编译结果没有任何警告。

这样就可以避免越界,避免警告了,所以在C语言中去掉gets的警告的最好方法就是不使用gets()[狗头][狗头][狗头]。

目前还没有复习到函数,复习到函数之后可以将这段代码放在函数里面,就可以方便的复用了。

完整代码如下:

#include<stdio.h>

int main(void)
{
    char ch = 0;
    char str1[64] = {0};
    char str2[64] = {0};
    int i = 0;
    int len = 0;

    //获取输入的一行字符存入str1,按enter结束,也就是以'\n'为结束符
    while(1)
    {
        scanf("%c",&ch);
        if('\n' == ch)
        {
            str1[i] = '\0';  //获取到'\n'之后,将'\0'存入有效字符串的末尾
            break;
        }
        else
        {
            str1[i] = ch;
            i++;
        }
        if(sizeof(str1)-1 <= i)
        {
            printf("输入字符数达到上限\n");
            break;//防止越界
        }
    }

    //记录字符串长度,因为 i 是 str1 的字符下标,所以 i+1 是 str1 的字符个数
    len = i + 1;

    //复制str1到str2
    for(i = 0; i < len; i++)
    {
        str2[i] = str1[i];
    }

    //打印str1和str1
    printf("str1 = %s\n",str1);
    printf("str2 = %s\n",str2);

    return 0;
}

这段代码的功能是,获取输入字符按enter键结束,复制字符串从str1到str2,最后打印出str1和str2.

标签:字符,ch,str1,C语言,警告,gets,去掉,输入
From: https://blog.csdn.net/weixin_50933109/article/details/145175873

相关文章

  • C语言——linux 【互斥锁、死锁、信号量、条件变量】内附代码及练习
    1、思维导图2、互斥锁1.互斥锁实现互斥的代码3.防死锁默认防死锁trylock(不推荐,容易破环互斥的同步性)常用防死锁的方式有——递归锁、错误检查锁函数原型:intpthread_mutexattr_settype(pthread_mutexattr_t*attr,intkind);功能描述:将互斥锁属性attr,设置成kind类......
  • vulfocus靶场实操tomcat-pass-getshell弱口令漏洞
    vulfocus靶场实操之tomcat-pass-getshell弱口令漏洞提前声明:本节所有操作都是在vulfocus靶场中进行操作,严禁在无授权的情况下进行任何的渗透操作。前言:本节主要对vulfocus靶场中tomcat中间件进行模拟攻击,通过该中间件存在的漏洞进入到后台拿到flag,完成该靶场要求。工具:BurpSu......
  • (四)C语言基础学习(3):深入理解输入输出函数、数据类型的格式控制与流程控制
    一、标准输入输出函数1.字符输入输出:getchar和putchar这两个函数是最基本的输入输出函数,用于单个字符的读取和显示。intgetchar(void);//从键盘获取一个字符intputchar(intc);//向终端输出一个字符示例:charch=getchar();//读取一个字符putchar(ch);......
  • C语言常见的概念
    1.C语⾔是什么? c语言是一种通用的、高级的编程语言。 我们可以联想一下,⼈和⼈交流使⽤的是⾃然语⾔,如:汉语、英语、⽇语。那⼈和计算机使⽤计算机语⾔。⽬前已知已经有上千种计算机语⾔,⼈们是通过计算机语⾔写的程序,给计算机下达指令,让计算机⼯作的。C语⾔就是众多计算机......
  • 【C语言分支和循环练习题】
    分支和循环练习1.打印1-100之间的所有素数2.随机数的生成:生成100-200之间的随机数1.打印1-100之间的所有素数#include<stdio.h>#include<math.h>intmain(){ inti=0; for(i=101;i<=200;i+=2) { intflag=1;//假设i是素数 intj=0; for(......
  • C语言输入输出
    一、语句以分号作为语句结束标志(一)分类 1.控制语句  2.函数调用语句  3.表达式语句 4.空语句  5.复合语句 (二)输入输出 输入--->计算机--->输出         [内存] c语言中用到的输入输出的功能,并不是c语言本身的一部分。而是......
  • 洛谷 P8469 [Aya Round 1 D] 文文的数学游戏 C语言
    题目:P8469[AyaRound1D]文文的数学游戏-洛谷|计算机科学教育新生态题目背景在解决了上一题之后,琪露诺觉得自己仿佛就是天才。于是,射命丸文又给了她一道简单的数学题。题目描述给定长度为 n 的整数序列 a,你需要构造一个长度为 n 的整数序列 b 满足对于所有......
  • 【C语言】_字符串函数strcpy
    目录1. 函数声明及功能2.使用示例3.注意事项4. 模拟实现4.1第一版:基本功能+判空+const修饰4.2第二版:优化对于'\0'的单独拷贝4.3第三版:仿strcpy的char*返回值1. 函数声明及功能char*strcpy(char*destination,constchar*source); strcpy功能:字......
  • 分类统计字符个数(PTA)C语言
    本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。函数接口定义:voidStringCount(chars[]);其中chars[]是用户传入的字符串。函数StringCount须在一行内按照letter=英文字母个数,blank=空格或回车个数,digit=数字字符......
  • C语言代码题:有评委对选手进行打分,分数为整数,接收数据为-1的时候结束,去掉一个最高分,去
    思路:    1、定义数组进行接收分数    2、用循环求最高分,最低分,总值    3、求平均分,输出#include<stdio.h>intmain(void){inti=0,val=0;inta[100]={0};doublemin=0,max=0,num=0,avg=0;//给数组赋值......