C程序打印重复字符

时间:2018-04-11 14:58:36

标签: c arrays

我正在尝试在C中创建一个读取单词的程序,如果有任何重复项则打印,如果是,则发生次数。它的工作原理(正如你在附图中看到的那样)但是一旦打印完一封信,我就不希望它重印同一封信。

我已经尝试将重复的字符存储在一个数组中,然后将新的副本与重复的数组进行比较,但它似乎不起作用。 有人知道一种不重印的简单方法吗?

#include <stdio.h>
#include <string.h>

int main(void) {
char word[100];
int x, i, j, freq, duplicates;
printf("Enter a word>\n");
scanf("%s", word);
x = strlen(word);
duplicates = 0;
freq = 1;
for(; i < x; i++) {
    j = 0;
    for(; j < x; j++) {
        if ((word[i] == word[j]) && (i != j)) {
                freq = freq + 1;
            }
    }
    if (freq >= 2) {
            printf("Duplicate letter: %c, Occurences: %d\n", word[i], freq);
            duplicates = 1;
            freq = 1;
        }
}
if (duplicates < 1) {
    printf("No duplicates found\n");
}
return 0;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

您的问题出现在for中,寻找重复的字母 第一个应该抛出字符串来查找所有字母:

for (i = 0; i < x; i++) {

第二个应该查找相同字符的出现:

for (j = i; j < x; j++) {

答案 1 :(得分:0)

因为它每次分别找到t和e时运行一次。一种解决方案是在打印重复通知并将其删除后,在char数组中查找该char的所有匹配项。

char * removeLetterFromArray(int toBeRemoved, char* string, int stringLength){
char * newString = malloc(stringLength * sizeof(char));

for(int i = 0; i < toBeRemoved; i++){
    newString[i] = string[i];
}

for(int i = toBeRemoved; i < stringLength; i++){
    newString[i] = string[i + 1];
}

return newString;
}

该代码应删除您使用toBeRemoved

定义索引的字母

因此,在您找到一个通过代码重复循环的字母后,找到所有出现该字母的地方并将其索引传递给上述方法。

如果您不想使用上述方法,另一种选择是创建一个已经输出的字母数组,并在将来忽略这些字母。