C中文件中最常见的字符

时间:2016-09-28 09:45:54

标签: c file character

我正在做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>

如果有人有任何修改我的代码的提示,我将非常感激:)我已经尝试从许多其他相关主题中搜索此问题的解决方案,但似乎没有任何效果。

3 个答案:

答案 0 :(得分:0)

你应该使用&lt;第二个for循环中的运算符。因此,当您检查频率[i]&gt; maxCount,在频率[26],它表现出未定义的行为,这意味着该指数的值可能小于或高于比较值。

答案 1 :(得分:0)

您的代码确实存在一些问题。但是,它们非常小,因此代码在小测试中仍然可以正常工作。

  1. int ch = fgetc(f);删除文件中的第一个字符

  2. for (int i = 0; i <= 26; ++i)突破阵列的范围(仅限0 - > 25)

  3. 除了这些小错误之外,您的代码非常精细。做得好#thumbsup

答案 2 :(得分:0)

  1. 循环超出范围。 @Weather Vane

    // for (int i = 0; i <= 26; ++i) {
    for (int i = 0; i < 26; ++i) {
    
  2. 代码丢弃第一个字符的结果。 @BLUEPIXY

    int ch = fgetc(f);
    if (ch == EOF) {
      return 0;
    }
    // This value of ch is not subsequently used.
    
  3. 其他修复如下

    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;
    }