C – 文件中的字符数

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

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

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

等等

我不知道如何显示和计算实例。

有什么想法吗?

#include  const char FILE_NAME[] = "input.txt"; #include  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); 

这就是我想出来的……

 #include #include 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 

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

 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]); 

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

 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']); 

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

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

 unsigned charCount[256] = { 0 }; 

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

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

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

 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); } } 
 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; } 

我刚才写的一个旧function..希望这有帮助;)
更多信息: http : //en.cppreference.com/w/c/string/byte/strchr