我正在尝试在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;
}
答案 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
定义索引的字母因此,在您找到一个通过代码重复循环的字母后,找到所有出现该字母的地方并将其索引传递给上述方法。
如果您不想使用上述方法,另一种选择是创建一个已经输出的字母数组,并在将来忽略这些字母。