我正在做C编程课程作业,我需要在给定文件中找到最常见的字符。
我使用testfile,emptyfile和其他少量文本文件进行测试效果很好(或者至少我认为是这样),但是在最后一个长测试文件中出现了问题,错误信息是:"应该已经退回了' e' (101)对于文件rfc791.txt。你回来了' b' (98)" 即可。
所以我问我的代码可能出现什么问题,突然间最常见的字母不应该是什么?
<html>
<head>
<script>
function hide(){
document.getElementById("pb").style.display = 'none';
setTimeout(function(){ alert("The paragraph gone!"); }, 3000);
}
</script>
</head>
<body>
<button id="hide" onclick="hide();">Hide</button>
<p id="pb">This is a paragraph with little content.</p>
</body>
</html>
如果有人有任何修改我的代码的提示,我将非常感激:)我已经尝试从许多其他相关主题中搜索此问题的解决方案,但似乎没有任何效果。
答案 0 :(得分:0)
你应该使用&lt;第二个for循环中的运算符。因此,当您检查频率[i]&gt; maxCount,在频率[26],它表现出未定义的行为,这意味着该指数的值可能小于或高于比较值。
答案 1 :(得分:0)
您的代码确实存在一些问题。但是,它们非常小,因此代码在小测试中仍然可以正常工作。
int ch = fgetc(f);
删除文件中的第一个字符
for (int i = 0; i <= 26; ++i)
突破阵列的范围(仅限0 - > 25)
除了这些小错误之外,您的代码非常精细。做得好#thumbsup
答案 2 :(得分:0)
循环超出范围。 @Weather Vane
// for (int i = 0; i <= 26; ++i) {
for (int i = 0; i < 26; ++i) {
代码丢弃第一个字符的结果。 @BLUEPIXY
int ch = fgetc(f);
if (ch == EOF) {
return 0;
}
// This value of ch is not subsequently used.
其他修复如下
int most_common_character(char *filename) {
...
// Use a more generous count @Weather Vane
// char frequency[26];
// Consider there may be more than 26 different letters
// fgetc return EOF and value in the unsigned char range
int frequency[UCHAR_MAX + 1] = { 0 };
// Not needed as array was initialize above
// for (ch = 0; ch < 26; ch++) { frequency[ch] = 0; }
// BTW correct type declaration of int, avoided rookie mistake of using char
int ch;
// Codes use tolower(), islower() as that is the portable way to
// handle type-of-character detection
while ((ch = fgetc(f)) != EOF) {
frequency[tolower(ch)]++; // could add check to insure frequency[] does not overflow
}
int maxCount = 0;
int maxChar = -1;
for (int i = 0; i <= UCHAR_MAX; ++i) {
if (islower(i) && frequency[i] > maxCount) {
maxCount = frequency[i];
maxChar = i;
}
}
fclose(f);
return maxChar;
}