C语言实现common_char字符串合并去重函数问题求助
问题修正与实现方案
你代码飘红的几个直接原因:
- 调用
malloc未引入<stdlib.h>头文件,编译器找不到函数定义会触发隐式声明错误 - 函数定义返回值为
char*但全程无return语句,会触发编译错误 - 嵌套循环的设计和题目给定规则不匹配,空if块无实际执行逻辑,无法达成需求
核心实现逻辑
题目已经给出明确实现规则,不需要做两边字符串的交叉重复比对,按规则分步实现即可:
- string1的所有字符直接完整拷贝到新串,不需要处理string1内部的重复字符,比如示例里"hello"的两个'l'都要保留,直接用
strcpy就能完成这一步 - 逐一遍历string2的每个字符,对当前字符做校验:只要这个字符没有在string1中出现过,就追加到新串末尾;如果已经在string1里存在,直接跳过
- 所有字符处理完成后,给新串末尾补上字符串结束符
\0,返回新串指针即可
判断string2的字符是否在string1存在时,直接遍历string1全串做等值比对即可,不需要复杂数据结构,这也是这类基础考试题的核心考察点——循环逻辑与字符串操作。
完整可运行代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char *common_char(char *string1, char *string2) { int str_length1 = strlen(string1); int str_length2 = strlen(string2); // 申请内存长度为两串长度和+1,足够存储所有字符+字符串结束符 char *new_string = (char*)malloc(str_length1 + str_length2 + 1); // 按规则先完整拷贝string1到新串 strcpy(new_string, string1); // 记录新串当前写入位置,初始在string1拷贝完成的末尾 int cur_pos = str_length1; // 遍历string2每个字符 for (int i = 0; i < str_length2; i++) { char cur_c = string2[i]; int exist = 0; // 标记当前字符是否在string1中存在 // 遍历string1查重 for (int j = 0; j < str_length1; j++) { if (string1[j] == cur_c) { exist = 1; break; // 找到匹配字符直接终止查重循环 } } // 字符不存在则追加到新串,写入位置后移 if (!exist) { new_string[cur_pos++] = cur_c; } } // 补字符串结束符 new_string[cur_pos] = '\0'; return new_string; } int main(void) { char s1[] = "hello"; char s2[] = "world"; char *res = common_char(s1, s2); printf("%s\n", res); // 输出hellowrd,和示例结果完全一致 free(res); // 释放malloc申请的堆内存,避免内存泄漏 return 0; }
补充说明
- 该实现完全贴合题目给定规则,不会额外处理string1内部的重复字符,比如输入string1为"aab"、string2为"abc"时,输出为"aabc",符合题目要求
- 不需要刻意追求复杂的查重优化,这类考试真题的评分核心是逻辑符合规则、运行结果正确、语法无错误,基础循环实现的可读性和正确率最高
内容的提问来源于stack exchange,提问作者Cedric xu
相关产品推荐
相关产品推荐

