C语言:从字符数组中删除匹配字符的实现问题求助
我来帮你搞定这个问题!你想要从字符数组n2里删掉所有和n中重复的字符,现有的代码还没实现真正的删除逻辑,我给你梳理下问题并给出可行的解决方案。
原代码的问题分析
先看看你当前代码里的几个小问题:
- 内层循环的
break位置错误:它会导致内层循环只检查j=0的字符就直接跳出,没法遍历n的所有字符来判断匹配 - 只是打印匹配的字符,没有真正修改
n2数组来移除这些字符 - 循环条件用
i<6会遍历到数组末尾的\0(字符串结束符),其实用字符串实际长度更合理
实现方案1:双指针+嵌套循环
我们可以用双指针法来修改n2数组:一个指针遍历原数组,另一个指针记录新数组的写入位置,只保留不在n中出现的字符。
#include <stdio.h> #include <string.h> // 用于获取字符串实际长度的strlen函数 int main(void) { char n[6] = "apple"; char n2[6] = "happy"; int new_idx = 0; // 记录处理后n2的有效字符下标 // 遍历n2的每一个字符(直到字符串结束符\0) for (int i = 0; i < strlen(n2); i++) { int is_duplicate = 0; // 标记当前字符是否在n中重复 // 检查当前字符是否存在于n中 for (int j = 0; j < strlen(n); j++) { if (n2[i] == n[j]) { is_duplicate = 1; break; // 找到重复就停止检查,提升效率 } } // 如果不是重复字符,就保留到新的位置 if (!is_duplicate) { n2[new_idx++] = n2[i]; } } n2[new_idx] = '\0'; // 必须添加字符串结束符,确保是合法的C字符串 printf("处理后的n2: %s\n", n2); return 0; }
代码逻辑说明
- 用
strlen(n2)和strlen(n)获取字符串的实际长度,避免遍历数组末尾的无效空间 new_idx作为新数组的写入指针,初始为0,每保留一个字符就自增1- 对
n2的每个字符,检查是否在n中出现:找到重复就标记,否则保留到新位置 - 最后一定要手动添加
\0,因为修改数组后需要确保字符串能被正确识别
运行这段代码后,n2会从"happy"变成"hy"(因为'a'和'p'都在"apple"里,被移除了)。
实现方案2:用strchr简化逻辑
如果想让代码更简洁,可以用C标准库的strchr函数,它能直接帮我们判断字符是否在字符串中存在:
#include <stdio.h> #include <string.h> int main(void) { char n[6] = "apple"; char n2[6] = "happy"; int new_idx = 0; // 遍历n2直到字符串结束 for (int i = 0; n2[i] != '\0'; i++) { // strchr在n中查找字符n2[i],找不到就返回NULL if (strchr(n, n2[i]) == NULL) { n2[new_idx++] = n2[i]; } } n2[new_idx] = '\0'; printf("处理后的n2: %s\n", n2); return 0; }
strchr(n, c)函数会在字符串n中查找字符c,找到就返回指向该字符的指针,否则返回NULL,用它可以替代内层的嵌套循环,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者Manju Naidu
相关产品推荐
相关产品推荐

