gpt4 book ai didi

c - C语言查找文件中出现次数最多的字符

转载 作者:太空狗 更新时间:2023-10-29 16:11:50 26 4
gpt4 key购买 nike

我正在编写一个函数来查找文件中最常见的字母字符。该函数应忽略字母以外的所有字符。

目前我有以下内容:

int most_common(const char *filename)
{
char frequency[26];
int ch = 0;

FILE *fileHandle;
if((fileHandle = fopen(filename, "r")) == NULL){
return -1;
}

for (ch = 0; ch < 26; ch++)
frequency[ch] = 0;

while(1){
ch = fgetc(fileHandle);
if (ch == EOF) break;

if ('a' <= ch && ch <= 'z')
frequency[ch - 'a']++;
else if ('A' <= ch && ch <= 'Z')
frequency[ch - 'A']++;
}

int max = 0;
for (int i = 1; i < 26; ++i)
if (frequency[i] > frequency[max])
max = i;

return max;
}

现在函数返回最频繁出现的字母的次数,而不是字符本身。我有点迷茫,因为我不确定这个函数是否应该是这样的。这是否有意义,我怎样才能解决这个问题?

非常感谢您的帮助。

最佳答案

变量frequency由字符代码索引。所以frequency[0]是 5,如果有 5 个 'a'。

在您的代码中,您将计数分配给 max ,而不是字符代码,因此您返回的是计数而不是实际字符。

您需要存储最大频率计数和它引用的字符代码。

我会用以下方法解决这个问题:

int maxCount = 0;
int maxChar = 0;
// i = A to Z
for (int i = 0; i <= 26; ++i)
{
// if freq of this char is greater than the previous max freq
if (frequency[i] > maxCount)
{
// store the value of the max freq
maxCount = frequency[i];

// store the char that had the max freq
maxChar = i;
}
}

// character codes are zero-based alphabet.
// Add ASCII value of 'A' to turn back into a char code.
return maxChar + 'A';

请注意,我更改了 int i = 1int i = 0 .从 1 开始意味着从 B 开始,这是一个您可能不会注意到的细微错误。此外,循环应终止于 <= 26。 ,否则你会错过 Z也是。

注意大括号。您的大括号样式(单语句 block 没有大括号)非常非常不推荐。

此外,i++++i 更常见在这种情况下。在这种情况下,这没有什么区别,所以建议 i++ .

关于c - C语言查找文件中出现次数最多的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29794953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com