存储数组中的字母数

时间:2014-04-08 14:59:01

标签: c

我需要创建一个程序来读取文件并存储所有字母的计数,处理大写和小写字母相同。到目前为止我得到了这个:

FILE *input;  
int letter=0;
char words;
int typeofletter[letter];
input = fopen("greatgatsby.txt", "r");
while(fscanf(input, "%c", &words) != EOF)
{
    if ((words>='A')&&(words<='z'))
    {
       letter++;
    }
}

如何将每个字母的数量存储到数组中?

4 个答案:

答案 0 :(得分:2)

  1. 创建一个大小为26的数组来存储数据。

    int lettercount[26] = {0};
    
  2. 您可以逐个字符地阅读文件的内容。当您找到字母表中的字母时,增加字母数。

    int c;
    while ( (c = fgetc(input)) != EOF )
    {
      if ( isalpha(c) )
      {
        ++(lettercount[tolower(c)-'a']);
      }
    }
    

答案 1 :(得分:1)

您应该使用ctype.h中的函数/宏来诊断和转换字符。下面,isalpha()用于判断字符是否为字母,toupper()用于将小写字母转换为大写字母。

由于ASCII(假设)中的字母由连续数字表示,从任何大写字母(或任何小写字母中的“a”)减去“A”的值将给出0到25之间的值,该值对应于该字母并且可以用作字母数组数组的索引。

如果您的字符集不是 ASCII,那么这将变得更加困难,超出了简单编程示例的范围。

以下是一个完整的工作示例。

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

#define N_LETTERS (26)

int main(int argc, char *argv[])
{
    FILE *fp;
    int counts[N_LETTERS] = {0};
    int inchar;
    int i;

    /* We expect a filename on the command line */
    if(argc!=2) {
        fprintf(stderr, "Supply a filename as an argument.\n");
        exit(EXIT_FAILURE);
    }

    /* Open the file, bug out on error. */
    fp = fopen(argv[1], "r");
    if( fp==NULL ) {
        fprintf(stderr, "Failed to open file '%s'.\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    /* This is the part you're most interested in */
    while( (inchar = fgetc(fp)) != -1 ) {  /* Read chars until error or EOF */
        if( isalpha(inchar) ) {            /* Only count letters            */
            i = toupper(inchar) - 'A';     /* Convert letter to index 0-25  */
            counts[i]++;                   /* Increment count for letter    */
        }
    }

    /* Close the file */
    fclose(fp);

    /* Print out the results */
    for(i=0; i<N_LETTERS; i++) {
        printf("Count of letter '%c': %d\n", 'A'+i, counts[i]);
    }

    return EXIT_SUCCESS;
}

答案 2 :(得分:1)

你可能需要这个(快速和脏,基于你的版本,没有错误检查,文件没有关闭,没有测试)

FILE *input;  
int letter=0;
char words;
int typeofletter[26];
input = fopen("greatgatsby.txt", "r");

while(fscanf(input, "%c", &words) != EOF)
{
   if ((words >= 'a') && (words <= 'z'))
   {
      words -= 'a'-'A' ;   // convert to up upper case
   }

   if ((words >= 'A') && (words <= 'Z'))
   {
      typeofletter[word - 'A']++;
   }
}

答案 3 :(得分:-3)

我必须指出的唯一问题是数组已静态设置并且其大小已设置,无法动态更改。

您最好使用其他顺序容器类型,例如c ++ vector。例如:

int Main(int argc, char * argc[])
{
 //.... preceding code
 FILE * OpenedFile; //Get the file and open it
 vector<char> ChrVec;

 for(/*EACH LETTER*/)
 {
   ChrVec.push_back(/*LETTERPOINTER*/ *p);
 }
}