我必须给出一个数字x,然后写出x个字符串(单词)。 我必须找到一个写作次数最多的那个。 它工作,但当我尝试从文件中读取它不。 例如,如果我执行a.out''<'文件和文件就像:
所有这些都在不同的行中,每个字符串在不同的行上工作,我打印你好,但如果很多字符串在一行中就像一个文本它不会工作(你好是的话,你好e.t.c ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char **str;
int n,i,j,y;
int count=0;
printf("Give a nubmer : \n");
scanf("%d", &n);
str = (char **)malloc(n *(sizeof(50)));
for(i=0; i<n+1; i++)
str[i] = (char *)malloc(50);
printf("Give n strings : \n");
for(i=0; i<n+1; i++)
{
gets(str[i]);
}
for(i=0; i<n+1; i++)
{
for (j=i+1;j<n+1;j++)
{
if(strcmp(str[i],str[j])==0)
{
count++;
// i++;
y=i;
}
}
}
printf("\n%s\n",str[y]);
}
是我使用gets而不是fgets的概率吗?
答案 0 :(得分:1)
请考虑以下事项:
#define NUM_STRINGS (10)
int strListCompare(const void *p1, const void *p2)
{
const char **str1 = p1;
const char **str2 = p2;
return strcmp(*str1, *str2);
}
int main(void)
{
char *strList[NUM_STRINGS] = {
"dog", "cat", "cat", "bat", "cat",
"cat", "dog", "bat", "dog", "bat"
};
qsort(strList, NUM_STRINGS, sizeof(char *), strListCompare);
char *curStr = strList[0], *maxStr = strList[0];
int curCount = 0, maxCount = 0;
for(int i = 0; i < (NUM_STRINGS - 1); i++)
{
curCount++;
if((strcmp(strList[i], strList[i + 1]) != 0) && (curCount > maxCount))
{
maxCount = curCount;
maxStr = strList[i];
curCount = 0;
}
}
printf("The winner! \"%s\" (%d occurrences)\n", maxStr, maxCount);
return 0;
}
执行上述程序会产生以下输出:
获胜者! “猫”(4次出现)
这是逻辑:
首先,
strList
未排序。我对它进行排序以帮助确定最常出现的字符串。在我扫描strList
之前,我假设第一个元素是最常出现的字符串。现在,我扫描strList
并计算出现次数。如果下一个字符串与当前字符串相同,我会增加curCount
。只要下一个字符串与当前字符串不同,我就会将curCount
与maxCount
进行比较。如果curCount
大于maxCount
,我发现了最常出现的新字符串。我将curCount
和当前字符串分别设置为maxCount
和maxStr
。当循环结束时,maxCount
和maxStr
将拥有最多出现的字符串。