-5

我尝试编写一个程序来计算从硬盘驱动器中存在的文件中获取的文本中的单词和字母。但是这个程序只计算第一行的字母数。我该怎么办?请给出你对这个程序的想法。请在您的编译器中调试我的代码并帮助我改进它。

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
int letter(const char sentence[ ]);
int words(const char sentence[ ]);
int main(int argc, char *argv[]) {
    char sentence[100];
    const char *filename = "test.txt";
    FILE *cfPtr;
    if (argc == 2)
        filename = argv[1];
    if ( (cfPtr = fopen(filename, "r")) == NULL ) {
        printf( "File '%s' could not be opened\n", filename );
    }
    else {
        int total = 0;
        int total2 =0;
        while (fgets(sentence, sizeof sentence, cfPtr))
            total += words(sentence);
        total2 +=letter(sentence);
        printf("%d\n", total2);
        printf("%d\n", total);
        printf("****%s",*cfPtr);
        fclose(cfPtr);
    }
    getch();
    return 0;
}
int words(const char sentence[ ])
{
    int i, length=0, count=0, last=0;
    length= strlen(sentence);
    for (i=0; i<length; i++)
    {
        if (sentence[i] == ' '||sentence[i] == '\t'||sentence[i] == '\n')
            count++;
    }
    return count;
}
int letter(const char sentence[ ])
{
    int i, length=0, count=0;
    length= strlen(sentence);
    for (i=0; i<length; i++)
    {
        if ((sentence[i]>'a'&&sentence[i]>'z')||(sentence[i]>'A'&&sentence[i]>'Z'))
            count++;
    }
    return count;
}
4

2 回答 2

2

您正在while()循环中关闭文件,您希望它退出。

while (fgets(sentence, sizeof sentence, cfPtr))
    total += words(sentence);
    total2 +=letter(sentence);
    printf("%d\n", total2);
    printf("%d\n", total);
    printf("****%s",*cfPtr);
    fclose(cfPtr); //<------- you want it out of loop
}
于 2013-06-21T09:35:30.443 回答
0

更正的 else 部分main

    else {
        int total  = 0;
        int total2 = 0;

        while (fgets(sentence, sizeof sentence, cfPtr)) {
          total  += words(sentence);
          total2 += letter(sentence);   // <<< this must be part of the while loop
        }

        printf("%d\n", total2);
        printf("%d\n", total);
        // printf("****%s",*cfPtr);  <<< this is nonsense and will most likely crash

        fclose(cfPtr);   
    }

并考虑一下这种letters明显错误的情况(我让您自己找出来作为练习):

(sentence[i] > 'a' && sentence[i] > 'z') || (sentence[i] > 'A' && sentence[i] > 'Z')

顺便说一句:C 允许空行和空格,以使源代码更具可读性。

于 2014-11-11T08:03:28.360 回答