0

私の目標は単純です。大文字/小文字、数字、句読点を含む単純なテキストファイルをユーザーに要求します。次に、ファイルを取得して開き、前述の各要素をスキャンして、それぞれの数を数えます。最後に、それぞれの合計を出力します(つまり、含まれる大文字の合計、小文字の合計、数字の合計、句読点の合計)。

残念ながら、私の質問はそれほど単純ではありません。Cが入力ファイルをfgetcのような関数に渡し、それをテストしてカウンターをインクリメントする方法がどれほど正確であるか(つまり、の概念と構文)、私は本当に混乱しています。プログラムがクラッシュし、その理由が不足しています。私の最初の質問は、なぜクラッシュするのかということだと思います。私のコードは以下の通りです。

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


int main()
{
    char Character = 0;
    int words = 0;
    int upper_case = 0;
    int lower_case = 0;
    int punctuation = 0;
    int digits = 0;
    int entered_words = 0;
    char user_filename[100];
    char user_filecontent[100];



    printf("Enter the filename of the file containing text and/or digits:\n");
    printf("(hit the Enter key when done)\n");
    gets(user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");


    if (fp == NULL)
    {
        printf("\nError, Unable to open the file for reading\n");
    }


    while((fp = fgetc(fp)) != EOF)
    {


            while((Character=fgetc(fp)) != '\n');
            {

                if (isalnum (Character))
                {
                    if (!entered_words)
                    {
                        entered_words = 1;
                        words++;
                    }
                }


                else
                {
                    if (entered_words)
                    {
                        entered_words = 0;
                    }
                }


                if (isupper(Character))
                {
                    upper_case++;
                }


                else if (islower(Character))
                {
                    lower_case++;
                }


                else if (isdigit(Character))
                {
                    digits++;
                }


                else if (ispunct(Character))
                {
                    punctuation++;
                }

            }

    fclose(fp);
    }

    printf("Total number of words is %d.\n", words);
    printf("Total number of digits are %d.\n", digits);
    printf("Total number of uppercase letters is %d.\n", upper_case);
    printf("Total number of lowercase letters is %d.\n", lower_case);
    printf("Total number of punctuation characters is %d.\n", punctuation);

return 0;
}
4

3 に答える 3

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


int main()
{
    char Character = 0;
    int words = 0;
    int upper_case = 0;
    int lower_case = 0;
    int punctuation = 0;
    int digits = 0;
    int entered_words = 0;
    char user_filename[100];
    char user_filecontent[100];



    printf("Enter the filename of the file containing text and/or digits:\n");
    printf("(hit the Enter key when done)\n");
    gets(user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");


    if (fp == NULL)
    {
        printf("\nError, Unable to open the file for reading\n");
    }


    while((Character = fgetc(fp)) != EOF)
    {

                if (isalnum (Character))
                {
                    if (!entered_words)
                    {
                        entered_words = 1;
                        words++;
                    }
                }


                else
                {
                    if (entered_words)
                    {
                        entered_words = 0;
                    }
                }


                if (isupper(Character))
                {
                    upper_case++;
                }


                else if (islower(Character))
                {
                    lower_case++;
                }


                else if (isdigit(Character))
                {
                    digits++;
                }


                else if (ispunct(Character))
                {
                    punctuation++;
                }
    }

    fclose(fp);

    printf("Total number of words is %d.\n", words);
    printf("Total number of digits are %d.\n", digits);
    printf("Total number of uppercase letters is %d.\n", upper_case);
    printf("Total number of lowercase letters is %d.\n", lower_case);
    printf("Total number of punctuation characters is %d.\n", punctuation);

return 0;
}

内側の while ループを削除し、fclose 関数呼び出しをループの外に移動しました。

于 2012-08-12T19:39:10.180 に答える
0

男fgetcは言う

fgetc()は、ストリームから次の文字を読み取り、それをintにキャストされたunsigned char、またはファイルの終わりまたはエラーのEOFとして返します。

この結果を格納するには、int変数を使用する必要があります

于 2012-08-12T19:25:32.860 に答える
0

あなたはあなたのwhileテストFILE *fpの結果をあなたに割り当てています:fgetc

while((fp = fgetc(fp)) != EOF)

これがおそらくクラッシュの原因です。fpは、呼び出した後のファイルへのハンドルです。その後は、、、などをfopen受け取る関数にファイルを渡すだけで済みます。FILE *fgetcfclose

また、2回呼び出しています。1fgetc回はwhileテストで、次にすぐに別のwhileテストで呼び出します。問題を修正した後でも、この方法で文字が失われますfp。なぜ内側のループが必要なのですか?

于 2012-08-12T19:24:54.213 に答える