下面的代码片段旨在计算文本输入后文件中遇到的所有符号,下一步是计算所有字符的出现次数(例如'a'遇到3次,'b'遇到0次等)。然而,当我编译时,循环变为无限,计数总是0。我的问题是是否可以用另一种方式修复或重写。
char type, c, text[100]; counts[100];
int count=0, i;
while((type=getchar())!=EOF) {
fputc(type, f); count++;
}
printf("Symbols found: %d", count-1);
rewind(f);
while(fscanf(f, "%s", &text)) {
for (i = 0; i < strlen(text); i++) {
counts[(text[i])]++;
printf("The %d. character has %d occurrences.n", i, counts[i]);
}
}
您可以在读取输入时构建直方图。getchar()
的返回值是int
,而不是char
,因为除了256个char
值之外,它还必须表示EOF
。一旦构建了直方图,您就可以遍历桶并打印它们。在这里,我假设所有256个char
值都是可能的,并且包含了以十六进制表示法显示不可打印字符的代码。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char **argv)
{
int c;
int i;
int histogram[256];
int total;
memset(histogram, 0, sizeof(histogram));
total = 0;
while ((c = getchar()) != EOF) {
histogram[c]++;
total++;
}
printf("Symbols found: %dn", total);
for (i = 0; i < 256; i++) {
if (histogram[i]) {
char repr[5];
sprintf(repr, isprint(i) ? "%c" : "\x%02x", i);
printf("The '%s'. character has %d occurrences.n", repr, histogram[i]);
}
}
return 0;
}
您的for
循环扫描字符串,变量i
是测试字符的索引,但您的printf
说i
是一个符号。您应该将计数和打印结果分开:
char * ptr;
while(fscanf(f, "%s", text))
for (ptr = text; * ptr != 0; ptr++)
counts[ (unsigned char)*ptr ]++;
for( i = 0; i < 256; i++)
printf("The %d. character has %d occurrences.n", i, counts[i]);
不要忘记声明count[ 256]
,并注意scanf
获取text
,而不是`&text~作为目标。