2

入力ファイルを指定すると、空白行とコメント行を除く、入力ファイル内のすべてのコード行の数を返すプログラムを作成しようとしています。次のコードを書きましたが、コメントや空白行を含む行を除外する方法について助けが必要です。

#include<stdio.h>
int main()
{
    int count;
    char ch;
    FILE *fptr;
    clrscr();
    fp=fopen("test.cpp","r");
    if(fp==EOF)
        {
        perror("Error:");
        }
    else
    {
        while(ch!=EOF)
        {
            ch=fgetc(fptr);
            if(ch=='\n')
                count++;
            if(ch=='\\')
                count--;
            if(ch=='\*')
                          {
                while(ch!='*\')
                                    {
                    ch=fgetc(fptr);
                                    }
            }
        }
    printf("the lines in the code are %d\n",count);
    fclose (fptr)
    }
    getchar();
    return 0;
}

空白行とコメント行がカウントされないように上記のコードを変更するにはどうすればよいですか?

4

5 に答える 5

3

入力ファイルを 1 文字ずつ読み取ると、1 行ずつ読み取る場合よりも多くの作業が必要になります。やっぱり行数を数えている...

疑似コード

    1. 行数を 0 に初期化する
    2. 一行読む
    3. ファイルの終わり?はい: 7 に移動
    4.それは良い線ですか?はい: 5 に移動します。いいえ: goto 2
    5. 行数を増やす
    6. 2から繰り返す
    7. 出力行数

今、あなたは尋ねます...良いラインとは何ですか?
プログラムの概算として、0 個以上の空白で構成される行を除くすべての行を考慮することをお勧めします。この概算はコメントをカウントしますが、ここからプログラムを開発できます。

次のバージョンは、空の行に // コメントがある行を無視します。

/*バージョン 3 では、 と の両方を含む行を無視できました。*/

バージョン 4 は複数行のコメントを処理します。

何よりも、楽しんでください!

于 2010-10-08T16:20:38.237 に答える
2

Cコメントはと//です/* */。次の行はあなたの問題がどこにあるかです:

        if(ch=='\\')
            count--;
        if(ch=='\*')
            while(ch!='*\')
                ch=fgetc(fptr);

もう1つの問題は、ある種のステートマシンがないと、一度に1文字ずつ読み取ることによって2文字のコメント区切り文字を一致させることができないことです。

また、コードは、コメントが実際のコード行に埋め込まれている場合に対応する必要があります。例えば。

x = 1;    // Set value of x

一度に1行ずつファイルを読み取り、各行が空白またはコメントであるかどうかを確認し、そうでない場合はカウンターをインクリメントする方がはるかに良いでしょう。

于 2010-10-05T04:20:54.437 に答える
1

\*と*\の代わりに//、/ *、*/を意味します

\はエスケープ文字として使用され、その後の文字の「意味」を変更します。

\n改行が表示されます。\\あなたが単一の\を取得し、\'であなたは開口部を閉じない何かを取得します'

これらのコメント文字を正しいものに置き換えると、コンパイルされるコードを取得する必要があります。しかし、それは正しくカウントされません。

次のような行を想像してみてください。

doSomething(); // foo
于 2010-10-05T04:25:03.677 に答える
1

文字定数に関する問題とは別に、 を処理する方法にエラーがありますfputcfputcを返しますintEOFred に残っている文字がない場合やエラーが発生した場合は負の整数定数であるどちらかを返すか、 として読み取ってunsigned charに変換した文字の値を返すことができintます。

の戻り値を比較fputcするchar前に変換するとEOF、有効な文字が等しいと比較されEOF、ループが早期に終了する可能性があります。

また、while最初の呼び出しの前にループが開始されるわけではないため、最初の反復での初期化されfputcていない値を使用しています。chこれにより、何かが起こる可能性があります。

ループを形成する慣用的な方法は次のようになります。

int ch;
while ((ch = fgetc()) != EOF)
{
    /* ... */
}

chループ内では、 にunsigned char変換されるという事実のために、戻り値の比較に注意する必要がありますint

ほとんどのプラットフォームでは、比較のために char 変数を作成するのが最も簡単な方法ですが、文字定数を同じunsigned charようにint変換ルーチンに渡すこともできます。

例えば

char c = ch;

if (c == '\n')

また

if (ch == (unsigned char)'\n')

他の人は、あなたの文字リテラルの問題を指摘しています。

于 2010-10-08T16:55:08.673 に答える
0

問題の一部は、ch変数の長さが1文字しかないことですが、\\andなどのコメントをテストする場合\*、これらは2文字の長さであるため、文字列比較を使用する必要があります。

もう1つの問題は、C / C ++の1行コメントが実際にはで始まり//、複数行コメントがで始まり、/*で終わること*/です。

于 2010-10-05T04:19:02.873 に答える