C 统计文本文件中出现的所有字符
以下代码段旨在统计输入文本后文件中遇到的所有符号,下一步是统计所有字符的出现次数(例如“a”遇到3次,“b”遇到0次等)。然而,当我编译时,循环将无限大,计数始终为0。我的问题是,它是否可以用另一种方式修复或重写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
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;
}
Yourfor
循环扫描字符串,变量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。您不应该在将计数相加的同一循环中打印计数。您需要先将所有计数相加,然后再执行另一个循环,打印每个字符的计数。