C语言中fgets()函数回车符相关的问题

fgets函数

fgets函数与gets函数

请移步下方链接,其中包含了scanf函数gets函数以及fgets函数的区分总结:

二维字符数组的三种输入方式浅析

fgets函数包含回车符

原因

  • 字符数组,回车符也可包含在其中

  • fgets函数将回车从缓冲区取出来自己留下(而gets函数是将回车从缓存区取出扔掉),因此用fgets函数输入字符串时,字符串末尾将携带有回车符缓冲区清空

    getchar()吸收回车符是从缓冲区中读取,因此在用fgets输入时,想用getchar()吸收末尾的回车符是不可行

消去回车符

需要消去回车符的情况

以字符插入题为例

任务描述

题目描述:输入两个字符串ab,将b串中的最大字符插入到a串中最小字符后面。

编程要求

请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。 输入 输入一段文字 输出 输入两个字符串ab

测试说明

样例输入: MynameisAmy MynameisJane 样例输出: MynameisAymy 提示: 字符串长度不超过100

思路
  1. 输入两个字符串
  2. 分别遍历,找到a串最小的字符及其位置和b最大的字符
  3. 分三段输出:a串最小字符及其前的内容,b串最大的字符,a串剩余的部分
代码
#include <stdio.h>
#include <string.h>
int main(void)
{
    /*********Begin*********/
    char a[100],b[100];
    int i=0,j=0,len1=0,len2=0,mark=0;
    char min,max;
    //输入a,b字符数组
    fgets(a,100,stdin);
    fgets(b,100,stdin);
    //得到数组长度,便于后续遍历
    len1=strlen(a);
    len2=strlen(b);
    //输入5个字符,但通过编译可知len1和len2的长度实际上为6,说明尾部的回车符也被录入字符数组中
    //因为是通过ASCII码来寻找数组中最大和最小的字符,这样的情况就会导致回车符干扰排序,无法输出正确的结果

    //找到a串最小的字符及其位置
    min=a[0];
    //处理回车符,这里有两种方法(二选一即可):
    //法一:将'\n'改为'\0'
    a[len1-1]='\0';
    //法二:将循环止于回车符前,即i<len1-1
    for(i=0;i<len1-1;++i){
        if(a[i]<min){
            min=a[i];
            mark=i;
        }
    }
    
    //找到b最大的字符
    max=b[0];
    for(j=0;j<len2;++j){
        if(b[j]>max){
            max=b[j];
        }
    }

    //分三段输出:
    //a串最小字符及其前的内容
    for(i=0;i<=mark;++i){
		printf("%c",a[i]);
    }
    //b串最大的字符
	printf("%c",max);
    //a串剩余的部分
	for(i=mark+1;i<len1;++i){
		printf("%c",a[i]);
    }
	printf("\n");

    /*********End**********/
    return 0;
}
问题关键

image-20221229184726338

消去操作
  1. 先用strlen函数得出该字符串长度(以字符数组a为例)

  2. 法一:将'\n'改为'\0'

    #include<stdio.h>
    #include<string.h>
    int main(){
        char a[100];
    	int len=0;
    
    	fgets(a,100,stdin);
    	len=strlen(a);
    	a[len-1]='\0'
        
        return 0;
    }
    

    法二:将循环止于回车符前,即i<len-1

    #include<stdio.h>
    #include<string.h>
    int main(){
        char a[100];
    	int len=0,i=0;
    
    	fgets(a,100,stdin);
    	len=strlen(a);
        for(i=0;i<len-1;++i){
            
        }
        
        return 0;
    }
    
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值