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

Posted

技术标签:

【中文标题】计算文本文件中出现的所有字符【英文标题】:Count all character occurrences in a text file 【发布时间】:2014-04-26 06:47:45 【问题描述】:

以下代码 sn-p 旨在计算输入文本后文件中遇到的所有符号,下一步是计算所有字符的出现次数(例如 '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]);
    
   

【问题讨论】:

你在哪里设置size 为什么不计算第一个getchar()循环中的字符数? 谢谢,酒保。已编辑。 字符代码大于 100。 您不应该在将它们相加的同一循环中打印计数。您需要先将所有计数相加,然后再循环打印每个字符的计数。 【参考方案1】:

您可以在阅读输入时构建直方图。 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: %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;

【讨论】:

【参考方案2】:

您的for 循环扫描字符串,其中变量i 是测试字符的索引,但您的printfi 是一个符号。 您应该将计数和打印结果分开:

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~作为目的地。

【讨论】:

以上是关于计算文本文件中出现的所有字符的主要内容,如果未能解决你的问题,请参考以下文章

Windows BAT:查找多个文件中出现的字符串

文本消息中字符串的猪计数出现

22.字符流

计算机系统

计算机系统

C语言一个简单的问题:输入一段文本,计算其中每个单词的出现频率:下面是代码