我正在尝试计算文件中的字符数并以十六进制显示。 一个例子:
'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。我不知道如何输出我想要的东西。
答案 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'
*/