char * s_gets函数个人理解

一、前提

在main函数中定义了一个字符数组,需要使用s_gets函数读取输入到该数组中

二、s_gets函数代码

char * s_gets(char * st, int n)
{
    char * ret_val;
    char * find;

    ret_val = fgets(st,n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');
        if (find)
            *find = '\0';
        else
            while (getchar() != '\n')
                continue;
    }

    return ret_val;
}

2.1参数

参数一:指针st,指向main函数中的字符数组;参数二:整型n,限制读取的字符串大小

2.2fgets函数

ret_val = fgets(st,n, stdin);

定义指针ret_val用于接收fgets函数的返回值。fgets函数有三个参数,表示从标准输入流中最多获取n-1个字符到指针st指向的数组中,第n个位置自动添加‘\0’。fgets函数读取成功返回st,读取失败或者读到文件末尾返回NULL指针

2.3替换‘\n’或舍弃多余输入

    if (ret_val)
    {
        find = strchr(st, '\n');    //查找字符函数
        if (find)
            *find = '\0';
        else
            while (getchar() != '\n')
                continue;
    }

如果fgets函数读取成功,则进入该if判断。假设fets中的参数n为5,我们输入3个字符后按回车结束输入,则st指向的数组中将存放3个字符、一个‘\n’和一个‘\0’。而这个‘\n’并不是我们想要的,所以需要查找并替换‘\n’。

2.3.1查找并替换‘\n’
        find = strchr(st, '\n');    //查找字符函数
        if (find)
            *find = '\0';

strchr函数在指针st指向的数组中查找第一个‘\n’(从st指向的地址开始查找,也即数组首元素),查找成功后,返回指向该‘\n’的指针。若查找失败,返回NULL指针。

接上文的假设,strchr函数查找到字符数组第4个位置存放的‘\n’后,进入if(find)判断,再然后通过*find = ‘\0’替换该‘\n’。

2.3.2舍弃多余输入

假设fgets中的参数n为5,而我们输入10个字符后按回车结束输入。则st指向的数组中将存放4个字符和一个‘\0’。此时缓冲区中还剩余6个字符和一个‘\n’未被读取,如果不将这6个字符舍弃,那么当下次再调用fgets函数时,无论输入多少字符,都只会先从上次剩余的字符中读取!

        else
            while (getchar() != '\n')
                continue;

因为st指向的字符数组中没有‘\n’,所以进入else语句,通过getchar()函数配合while循环将缓冲区剩余的字符读出,直到读到‘\n’跳出循环,并结束else语句。这样就实现了将多余输入清除的目的。

注:continue在此处写不写并无影响

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值