C语言编写删除字符串重复字符程序

问题描述: 编写一个函数 del(s),将输入的字符串 s 中重复出现的字符删除,只保留最后出现的字符,要求大小写无关(即'A' 与 'a' 视为相同字符)。在 main() 函数中测试此函数:从键盘输入一个字符串,然后调用该函数进行删除重复字符串操作,将结果打印到屏幕上。

输入形式: 从键盘输入一个字符串。

输出形式: 在屏幕上输出删除重复字符以后的字符串。

输入样例:

AbCdaAbcdEeF

输出样例:

AbcdeF

样例说明:

由于要求大小写无关,将字符串'AbCdaAbcdEeF' 删除重复出现的字符,只保留最后出现的字符后的结果是'AbcdeF', 故打印输出:AbcdeF

解题思路:

首先将输入的字符串中的所有大写字母转为小写字母,这样可以使大小写不敏感,方便后续操作。然后遍历字符串,将每个字符出现的位置记录在一个数组中。最后再次遍历字符串,对于每个字符,找到最后一次出现的位置,如果当前位置就是最后一次出现的位置,则将该字符加入到结果字符串中。

具体实现见代码:

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

char *del(char *s) {
    int len = strlen(s);
    char *result = (char *)malloc(len + 1); // 分配结果字符串内存
    int last_pos[256] = {0}; // 记录每个字符最后出现的位置
    int result_len = 0; // 结果字符串长度

    // 将所有大写字母转换为小写字母
    for (int i = 0; i < len; i++) {
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[i] = s[i] + 32; // 大写字母转小写
        }
    }

    // 记录每个字符最后出现的位置
    for (int i = 0; i < len; i++) {
        last_pos[s[i]] = i;
    }

    // 遍历字符串,将最后出现的字符加入结果字符串
    for (int i = 0; i < len; i++) {
        if (i == last_pos[s[i]]) {
            result[result_len++] = s[i];
        }
    }
    result[result_len] = '\0'; // 添加字符串结束符
    return result;
}

int main() {
    char s[100];
    printf("请输入一个字符串:");
    gets(s);

    char *result = del(s);
    printf("删除重复字符后的字符串:%s\n", result);

    free(result); // 释放内存
    return 0;
}

代码说明:

  • del(char *s) 函数:
    • 使用 strlen(s) 获取字符串长度。
    • 使用 malloc(len + 1) 分配一个大小为 len + 1 的字符数组,用于存储结果字符串,其中 len + 1 中的 1 用于存储字符串结束符 \0
    • 使用 last_pos[256] 数组记录每个字符最后一次出现的位置,由于字符的 ASCII 码值范围为 0-255,因此使用大小为 256 的数组足够。
    • 使用 result_len 变量记录结果字符串的长度。
    • 首先将所有大写字母转换为小写字母,方便大小写无关操作。
    • 遍历字符串,将每个字符最后出现的位置记录到 last_pos 数组中。
    • 再次遍历字符串,如果当前字符是最后一次出现的位置,则将该字符加入到结果字符串中。
    • 最后将结果字符串返回。
  • main() 函数:
    • 从键盘输入字符串。
    • 调用 del(s) 函数处理字符串。
    • 打印输出结果字符串。
    • 使用 free(result) 释放 result 指针指向的内存空间,避免内存泄漏。

程序运行结果:

输入:AbCdaAbcdEeF 输出:AbcdeF

C语言编写删除字符串重复字符程序

原文地址: https://www.cveoy.top/t/topic/o0kU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录