在那个程序中我将给出6个名字然后我想从全名中找到频繁的字符。我尝试了这个,但它并没有向我展示所有名字中的角色,但是整个名字都被保留了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 6
int main()
{
char name[max][20];
char *ptrnaame;
int i,j,len, cnt, k, next, occurence=0, maximum=0;
char *index_max=NULL;
ptrname=name[0];
for(i=0; i<max; i++)
{
printf("Give the name :");
gets(name[i]);
len=strlen(name[i]);
while(len>20)
{
printf("Give the name again:");
gets(name[i]);
}
}
for(i=0; i<max; i++)
{
occurence=0;
for(j=i; j<20; j++)
{
if(!strcmp(*(name+i), *(name+j)))
{
occurence++;
}
}
if(occurence>maximum)
{
maximum=occurence;
index_max=*(name+i);
}
}
if(index_max!=NULL)
{
printf("The most frequent character is: %s with %d occurences", index_max, maximum);
}
system("pause");
return 0;
}
答案 0 :(得分:2)
您正在打印字符串(%s
)而不是字符(%c
)。
试试这个
printf("The most frequent character is: %c with %d occurences", index_max[0], maximum);
答案 1 :(得分:1)
您的程序存在其他人已经指出的错误。最大的错误是程序的逻辑不正确。
我估计如果你的名字是Alice,Bob,Charlie,Dora,Emily和Frank,你希望输出为E,这通常发生在所有名称上,即4次。
如果是这样,那么你必须计算所有角色的出现次数。有很多可能的方法可以做到这一点。您可以遍历所有字母,然后遍历所有单词及其字母,并在字母匹配时递增计数。这很简单,但效率很低,因为你处理的数据是26次。
更好的方法可能是保留一系列字母数。然后你需要检查每个单词和每个字母只有一次:查看字符,如果它是一个字母,增加相应的数量。
一个好的副作用是现在你不再需要存储名字了。当用户输入字母时,让字母从stdin
流入,处理它们并立即忘记它们。您只对每个字母的总数感兴趣。
不存储名称也意味着您不再遇到内存管理问题。例如,在原始代码中,您希望将每个单词中的字母从0到20循环,但单词中不一定有很多字母。 char缓冲区仅保存有效输入,直到终止空字符;之后的一切都是垃圾。你也错误地使用字母索引作为单词的索引,其中只有六个。这会导致内存访问不良。
这是一个示例实现,允许您输入任意数量的名称:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int count[26] = {0}; // counts for 26 letters
char line[80]; // line buffer
int i;
puts("[Please enter text. A blank line or Ctrl-D/Z ends input.]");
while (fgets(line, sizeof(line), stdin)) {
int nonspace = 0;
for (i = 0; line[i] != '\0'; i++) {
int c = line[i];
if ('A' < c && c <= 'Z') count[c - 'A']++;
if ('a' < c && c <= 'z') count[c - 'a']++;
if (c != ' ' && c != '\n') nonspace++;
}
if (nonspace == 0) break;
}
int imax = 0;
for (i = 1; i < 26; i++) {
if (count[i] > count[imax]) {
imax = i;
}
}
printf("Most frequent character is %c (occurs %d times).\n",
'A' + imax, count[imax]);
return 0;
}