我试图创建一个关于关键字密码的程序,但却从字母字符中删除了关键字(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);
答案 0 :(得分:2)
您搜索另一个字符串中存在的一个字符串的字符是不正确的。以下是解决问题的方法:
答案 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
字符的文本量。更好的方法是使用一个数组,其中每个位置被映射以表示字母a
到z
。这样,在循环之前,您只需为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
,您可以调整整个过程以考虑这些大写字母。