如何删除C中超过重复的字符

时间:2018-02-04 10:43:11

标签: c

我试图创建一个关于关键字密码的程序,但却从字母字符中删除了关键字(alphabet2)字符。它最终会有重复的字符。我该如何删除它? 我的示例关键字是单词helo,它给了我abcdfgijkmnpqrstuvwxyzzzzz的结果。 如何删除它?

    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    char alphabet2[] = "helo";

for(i = 0 ; i < strlen(alphabet2); i++){
    for(j=0, k=0; j < strlen(alphabet); j++){
        if(alphabet2[i] != alphabet[j]){
            alphabet[k] = alphabet[j];
            k++;
        }
    }
}
puts(alphabet);

2 个答案:

答案 0 :(得分:2)

您搜索另一个字符串中存在的一个字符串的字符是不正确的。以下是解决问题的方法:

  1. 翻转循环的顺序。 alphabet上的循环应位于外部
  2. 反转嵌套循环。目前,只要找到不相等的字符,就会停止。相反,在决定是否应保留或丢弃下一个字符之前,您应该查看当前alphabet2中的所有字符。
  3. 完成处理后,空终止alphabet。这可以通过在两个循环完成后将alphabet[k]设置为零来完成。
  4. Demo.

    注意:由于您使用的是字符串函数strlen,因此可以使用另一个字符串函数strchr来消除嵌套循环。考虑将此作为练习。

答案 1 :(得分:1)

您可以使用strchr来缓解问题:

size_t len = strlen(alphabet);
size_t k = 0;
for(size_t i = 0 ; i < len; i++){
    if(!strchr(alphabet2,alphabet[i])){
        alphabet[k++]=alphabet[i];
    }
}
alphabet[k]=0;

循环遍历字符串时 - 使用strlen并不是一个好的性能 - 它会重复计算字符串的长度。 (也不需要)。在这里,我们将过滤keyword个字母。在alphabet中找到keyword的信后,它将不会插入alphabet

但就此而言 - 考虑一下您要删除keyword字符的文本量。更好的方法是使用一个数组,其中每个位置被映射以表示字母az。这样,在循环之前,您只需为1中出现的字符标记keyword。当过滤掉O(1)的字符时,这将导致alphabet检查。(是的,您需要有一些内存来存储数组)。

int m[26]={0};
size_t len = strlen(alphabet2);
for(size_t i = 0; i < len; i++)
   m[alphabet2[i]-'a']=1;
size_t k = 0;
len = strlen(alphabet);
for(size_t i = 0 ; i < len; i++){
   if(!m[alphabet[i]-'a'])){
      alphabet[k++]=alphabet[i];
    }
}
alphabet[k]=0;

如果keyword包含A - Z,您可以调整整个过程以考虑这些大写字母。