C:计算文件中 Upper/Lower 个大小写字符的数量

C: Counting the number of Upper/Lower case chars out of a file

好吧,我正在尝试从一个文件中读取一段文本,然后将有多少个大写和小写字符以及多少个数字写入另一个文件。

#include <stdio.h>

int main()
{
    int *p;
    int caps, low, num, i;
   caps = low = num = 0;

    FILE *fin, *fout;

    fin = fopen("input.txt","r");
    fout = fopen("output.txt","w");

    if (fin == NULL)
    {
       printf("FILE ERROR\n");
       return 1;
    }
    else
        printf("BABE THIS WORKS\n");

    i=0;

    while(fscanf(fin, "%s", p) != EOF)
      {
              if(p[i] >= 'a' && p[i] <= 'z')                
                         low++;         
              if(p[i] >= 'A' && p[i] <= 'Z')                
                         caps++;  
              if(p[i] >= '0' && p[i] <= '9')                
                         num++;                               
      }

    fprintf(fout,"Lower: %d, Caps: %d, Numbers: %d", low, caps, num);

    fclose(fin);
    fclose(fout);

 system("pause");   
 return 0;   
}

然而,当我 运行 这个时,它只是 "crashes" 而没有在 output.txt 文件中写入任何内容。

我错过了什么?

由于您正在比较 个字符 ,最简单的读取方式是使用 character-oriented 输入。该库提供了几个 character-oriented 输入函数,(例如 getchar()(从 stdin 读取)或 getcfgetcFILE* stream 读取)。这样可以避免在读取后必须遍历任何数组来检查每个字符。

使用您的方法的一个简短示例如下。唯一的调整是包含一个三元运算符,它可以将 read/writes 添加到作为程序参数给出的文件名中(或者如果没有给出文件名,则使用默认的 stdinstdout)。它只是防止对文件中的文件名进行硬编码。要在 input.txtoutput.txt 上使用该程序,只需将程序调用为 ./programname input.txt output.txt:

#include <stdio.h>

int main (int argc, char **argv)
{
    int p, caps, low, num;
    p = caps = low = num = 0;

    FILE *fin, *fout;

    /* read from filename argv[1] (default: stdin), 
       write to  filename argv[2] (default: stdout) */
    fin  = argc > 1 ? fopen (argv[1], "r") : stdin;
    fout = argc > 2 ? fopen (argv[2], "w") : stdout;

    if (fin == NULL) {
        fprintf (stderr, "input file open failed.\n");
        return 1;
    }
    if (fout == NULL) {
        fprintf (stderr, "output file open failed.\n");
        return 1;
    }

    while ((p = fgetc (fin)) != EOF)
    {
        if ('a' <= p && p <= 'z') low++;         
        if ('A' <= p && p <= 'Z') caps++;  
        if ('0' <= p && p <= '9') num++;                               
    }

    fprintf (fout, "\n Lower: %d, Caps: %d, Numbers: %d\n\n", low, caps, num);

    if (fin  != stdin)  fclose(fin);
    if (fout != stdout) fclose(fout);

    //system("pause");   

    return 0;   
}

示例输入文件

$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.

输出(reading/writing默认为stdin/stdout)

$ ./bin/countltrs <../dat/captnjack.txt

 Lower: 47, Caps: 12, Numbers: 0

如果您还有其他问题,请告诉我。