C语言编写删除字符串重复字符程序
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
原文地址: https://www.cveoy.top/t/topic/o0kU 著作权归作者所有。请勿转载和采集!