C语言经典例32-删除字符串中指定的字符

1 题目

删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。

2 分析

本题是要处理字符串,在C语言中,我们把他转换为字符数组,则本质是要处理数组,在数组中删除某一元素的最简单方法是设定一个标记位point初始为0,它代表着当前保存的非删除字符的位置,而循环变量i则是要遍历整个字符数组,在循环时,若遇到删除字符,则i向前进(递增),而point由于当前不是有效字符,所以point不变,当遇到有效字符时,将该字符保存在point的位置,并且point向前进(递增),通过ipoint以不同的规律递增,从而找到出有效的字符并逐一覆盖前面的要删除的字符。

下面以简单的图示来描述这个算法,假设要删除的字符为a

  1. 起初ipoint(为简单起见,下面都用p)都指向数组的第一个位置
    在这里插入图片描述
  2. 在判断后发现i位置的字符就是a,则进行下一轮循环,i递增,p不动
    在这里插入图片描述
  3. 在判断后发现i位置的字符不是a,则将i位置的b,赋值给p位置,然后ip都递增,这样的话,原来要删除的a就被后面的字符“覆盖”掉了,循环结束后相当于字符串中的a都被删除了
    在这里插入图片描述

注:该程序设计思想,在数组的题目中广泛使用,需要熟练掌握

3 实现

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

void deleteChar(char a, char str[]) {
    int strLength = strlen(str); // 计算字符串的长度
    int point = 0; // 字符串位置标号,用于保存当前有效字符位置
    for (int i = 0; i < strLength; i++) {
        if (str[i] == a) {
            continue; // 若当前字符为要删除的字符,则直接跳过继续进行循环
        } else {
            str[point] = str[i]; // 当前字符为非删除字符,则往前覆盖
            point++; // 有效字符标号位置递增
        }
    }
    str[point] = '\0'; // 循环结束,最后一个字符为结束符
}

int main(void) {
    char a; // 要删除的字母
    char str[200]; // 保存字符串
    scanf("%s", str);
    deleteChar('a', str); // 这里把要删除的字符写死了,为`a`,你也可以换成输入语句,自行输入
    puts(str);
	return 0;
}


4 运行结果

abcaabbcc
bcbbcc
  • 77
    点赞
  • 218
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值