2

所以我想制作一个程序来计算文件中每个字符的出现次数。例如:

字符 0x67 (g) 的 4 个实例

字符 0x68 (h) 的 11 个实例

等等

我不确定如何显示和计算实例。

有什么想法吗?

#include <stdio.h>
const char FILE_NAME[] = "input.txt";
#include <stdlib.h>

int main() {

    int             count = 0;  /* number of characters seen */
    FILE           *in_file;    /* input file */

   /* character or EOF flag from input */
    int             ch;

    in_file = fopen(FILE_NAME, "r");
    if (in_file == NULL) {
        printf("Cannot open %s\n", FILE_NAME);
        exit(8);
    }

    while (1) {
        ch = fgetc(in_file);
        if (ch == EOF)
            break;
        ++count;
    }
    printf("Number of characters in %s is %d\n",
                  FILE_NAME, count);

    fclose(in_file);
    return (0);
4

6 回答 6

7

这就是我想出的...

#include<stdio.h>
#include<stdlib.h>

int main() {
  /* a buffer to hold the count of characters 0,...,256; it is
   * initialized to zero on every element */
  int count[256] = { 0 };

  /* loop counter */
  int k;

  /* file handle --- in this case I am parsing this source code */
  FILE *fp = fopen("ccount.c", "r");

  /* a holder for each character (stored as int) */
  int c;

  /* for as long as we can get characters... */
  while((c=fgetc(fp))) {

    /* break if end of file */
    if(c == EOF) break;

    /* otherwise add one to the count of that particular character */
    count[c]+=1;
  }

  /* now print the results; only if the count is different from
   * zero */
  for(k=0; k<256; k++) {
    if(count[k] > 0) {
      printf("char %c: %d times\n", k, count[k]);
    }
  }
  /* close the file */
  fclose(fp);

  /* that's it */
  return 0;
}

我使用以下命令编译代码(OS X 10.7.4 上的 GCC 4.8.1)

gcc ccount.c -Wall -Wextra -pedantic -ansi

它编译时没有警告和错误;这是输出:

char 
: 40 times
char  : 190 times
char ": 6 times
char #: 2 times
char %: 2 times
char ': 1 times
char (: 11 times
char ): 11 times
char *: 23 times
char +: 3 times
char ,: 5 times
char -: 3 times
char .: 9 times
char /: 20 times
char 0: 5 times
char 1: 1 times
char 2: 3 times
char 5: 3 times
char 6: 3 times
char :: 1 times
char ;: 13 times
char <: 3 times
char =: 7 times
char >: 3 times
char E: 2 times
char F: 2 times
char I: 2 times
char L: 1 times
char O: 1 times
char [: 4 times
char \: 1 times
char ]: 4 times
char a: 29 times
char b: 4 times
char c: 36 times
char d: 15 times
char e: 49 times
char f: 25 times
char g: 4 times
char h: 22 times
char i: 36 times
char k: 9 times
char l: 19 times
char m: 5 times
char n: 35 times
char o: 38 times
char p: 9 times
char r: 34 times
char s: 22 times
char t: 49 times
char u: 16 times
char v: 1 times
char w: 4 times
char y: 2 times
char z: 3 times
char {: 5 times
char }: 5 times
于 2013-10-17T00:18:12.187 回答
3

您需要使用数组,请查看:

int charArray[256];
memset(charArray, 0, 256*sizeof(int)); // instead of memset, for 0 values you can you just {0}

while (1) {
        ch = fgetc(in_file);
        if (ch == EOF)
            break;
        charArray[ch]++;
    }
for (int i=0; i<256; i++)
    if (charArray[i] > 0)
        printf("Number of character %c is %d\n", (char)i, charArray[i]);
于 2013-10-17T00:09:15.983 回答
1

如果要检索字母字符的计数,则可能如下所示:

int counts[26];
memset(&counts[0], 0, sizeof(counts));

while ( (ch = fgetc(in_file)) != EOF) {
    if (ch >= 'a' && ch <= 'z')
        ++count[ch - 'a'];
}

将它们打印出来可能很简单:

for (char c = 'a'; c <= 'z', ++c)
    printf("Count of '%c' is %d\n", c, count[c - 'a']);
于 2013-10-17T00:12:18.017 回答
1

我在这里找到的一个简单程序。它需要两个输入,首先是您要计算的字符和必须计算字符出现的文件名。

于 2015-04-25T22:47:41.903 回答
0
int strchro(char c, char *str) {

    char *pch;
    int found = 0;
    pch=strchr(str,c);
    while (pch!=NULL)
    {
        //printf("found at %d\n",pch-str+1);
        found++;
        pch=strchr(pch+1,c);
    }
    return found;
}

我前一阵子写的一个旧函数..希望这会有所帮助;)
这里有更多信息:http: //en.cppreference.com/w/c/string/byte/strchr

于 2013-10-17T00:14:34.167 回答
0

您可以使用 256 个整数的数组(在许多平台上char是 8 位值)。由于字符在文件中出现的次数不能为负数,因此无符号类型是有意义的。

unsigned charCount[256] = { 0 };

数组中的每个槽代表具有该值的字符出现在该文件中的次数。

while ((ch = fgetc(in_file)) != EOF)
{
    // increment the count of character ch
    charCount[ch]++;
}

打印出来时,有些字符是不可打印的或者是空白字符(如果您正在读取二进制文件,这尤其适用),您可以使用标头中的isprintandisspace函数ctype.h

for (int i = 0; i < 256; i++)
{
    // only display characters with a count of at least 1
    if (charCount[i] > 0)
    {
        if (!isprint(i) || isspace(i))
            printf("%u instances of character %x\n", charCount[i], (unsigned) i);
        else
            printf("%u instances of character '%c'\n", charCount[i], i);
    }   
}
于 2013-10-17T00:17:34.640 回答