C 统计文本文件中出现的所有字符

C 统计文本文件中出现的所有字符,c,file,for-loop,while-loop,C,File,For Loop,While Loop,以下代码段旨在统计输入文本后文件中遇到的所有符号,下一步是统计所有字符的出现次数(例如“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

以下代码段旨在统计输入文本后文件中遇到的所有符号,下一步是统计所有字符的出现次数(例如“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]);
    }
}   
char类型,c,text[100];计数[100];
int计数=0,i;
而((type=getchar())!=EOF){
fputc(type,f);count++;
}
printf(“找到的符号:%d”,计数-1);
倒带(f);
while(fscanf(f、%s、&text)){
对于(i=0;i
您可以在读取输入时构建直方图。
getchar()
的返回值是
int
,而不是
char
,因为除了256个
char
值外,它还必须表示
EOF
。构建直方图后,您可以迭代存储桶并打印它们。在这里,我假设所有256个字符都是可能的,并且包含了以十六进制表示法显示不可打印字符的代码

#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: %d\n", 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;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
INTC;
int i;
int直方图[256];
整数合计;
memset(直方图,0,sizeof(直方图));
总数=0;
而((c=getchar())!=EOF){
直方图[c]++;
总计++;
}
printf(“找到的符号:%d\n”,总计);
对于(i=0;i<256;i++){
if(直方图[i]){
char-repr[5];
sprintf(repr,isprint(i)“%c”:“\\x%02x”,i);
printf(““%s”。字符出现了%d次。\n”、repr、直方图[i]);
}
}
返回0;
}

Your
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]);
char*ptr;
while(fscanf(f,“%s”,文本))
对于(ptr=text;*ptr!=0;ptr++)
计数[(无符号字符)*ptr]++;
对于(i=0;i<256;i++)
printf(“该%d.字符出现了%d次。\n”,i,计数[i]);

不要忘记声明
count[256]
,并注意
scanf
获取
text
,而不是`&text~作为目的地。

您在哪里设置
size
?为什么不在第一次
getchar()
循环中计数字符?谢谢,酒吧招待。已编辑。字符代码大于100。您不应该在将计数相加的同一循环中打印计数。您需要先将所有计数相加,然后再执行另一个循环,打印每个字符的计数。