以十六进制计算文件中的字符数

时间:2016-10-25 00:58:41

标签: c

我正在尝试计算文件中的字符数并以十六进制显示。 一个例子:

'a'的5个实例

'n'''''的实例

我不想输出未在文件中出现的字符,因此不在我的数组中。我想输出文件中的实例。

我不确定如何打印已发生的每个实例,因为我不想输出'something'的'0'实例。

#include <stdio.h>

int main(int argc, char const *argv[]) {
    int c;
    FILE *f = fopen(argv[1], "r");
    int totalchars[256] = { 0 };
    while ((c = getc(f)) != EOF) {
        if (totalchars[c] == 0)
            totalchars[c] = 1;
        else
            totalchars[c]++;

    } // while

    for (int i = 0; i < 256; i++)
        printf("%d instances of character %x\n", totalchars[i], c);

    return 0;
}

我知道打印时,c位于文件末尾,因此会打印ffffffff。我不知道如何输出我想要的东西。

2 个答案:

答案 0 :(得分:4)

首先,你不需要

if (totalchars[c] == 0)
    totalchars[c] = 1;
else
    totalchars[c]++;

说完

totalchars[c]++;

添加1会将0更改为1,就像它会将5更改为6.我假设您将if (totalchars[c] == 0)测试放在此处,因为您不想打印计数为0,但是它被错放了。 (见下文。)

其次,你需要

for(int i = 0; i < 256; i++)
    printf("%d instances of character %x\n", totalchars[i], i);

这样,对于阵列中的每个(最多)256个插槽,您可以打印为该插槽计算的字符(i),而不是重复您读取的最后一个EOF字符来自文件(c)。

最后,当您打印出数组时,它需要测试0的计数,并禁止它们。所以它看起来像这样:

for(int i = 0; i < 256; i++) {
    if(totalchars[i] != 0) {
        printf("%d instances of character %x\n", totalchars[i], i);
    }
}

附录:在回答您的后续问题时,如果输出也包含该字符本身,则输出可能会更有用:

        printf("%d instances of character %x: %c\n", totalchars[i], i, i);

但是,它有一点点缺点,它会尝试打印特殊字符,如空格,制表符和换行符,这些字符本身看起来不太合适。

答案 1 :(得分:0)

您使用的是错误的变量,复制和粘贴时要小心

printf("%d instances of character %c\n", totalchars[i], i);
/*                                                      ^
 *                                   should be `i' not `c'
 */