fgets() 字符串读取 Linux环境

由于gets()函数会导致段错误,超出数组下标造成越界,所以了解了以下函数
fgets( 数组名, sizeof(数组名),流(一般键盘输入为stdin))
fgets()函数的好处是防止了内存溢出,由于获取了数组长度,不会发生段错误
fgets()读取字符串长度为读取数组长度n-1位,若数组空间足够大,回车键字符‘\n’也会被读取进数组,并且在最后一位补‘\0’表示字符串结束
一般分以下两种情况:

数组长度为5
输入abcdefg’\n’

01234
abcd‘\0’

数组长度为10
输入abcdefg’\n’

0123456789
abcdefg‘\n’‘\0’

多余的数据会留在缓冲区
由于linux环境下fflush()函数没法使用(编译不报错,但功能不实现)
第二次调用会把上次缓冲区多余的字符读进来,所以需要一个清除缓冲区的函数来实现
一般清除缓冲区可以用一下方法

char ch;
    do{
        ch = getchar();
    }while(ch != '\n');		//读到回车退出循环

但是fgets()有时会把回车读走,因此每次清除缓冲区之前还需要判断fgets()是否有遗留
代码如下

#include <stdio.h>
#include<string.h>

void clean();

int main()
{
    char num[12], nu[12];		//fgets()最多能读取n-1个字符,但我为了去掉‘\n’预留了一位用作替换
    char c;
    fgets(num,sizeof(num),stdin);	//键盘输入
    
    if(num[strlen(num)-1] != '\n')		//若没有获取到'\n',表示缓冲区有遗留
        clean();							//清除缓冲区
        
    num[strlen(num)-1] = '\0';			//统一将系统默认补‘\0’前一位替换成'\0',若有回车将会被消除
    fputs(num,stdout);				//屏幕输出
    fputc('\n',stdout);				//输出换行
    fgets(nu,sizeof(nu),stdin);		//键盘输入
    
    if(nu[strlen(nu)-1] != '\n')			//同上
        clean();
        
    nu[strlen(nu)-1] = '\0';
    fputs(nu,stdout);
    fputc('\n',stdout);
    return 0;
}

void clean()			//清除缓冲区
{
    char ch;
    do{
        ch = getchar();
    }while(ch != '\n');
}

运行结果如下
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值