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
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐