1

Cとシステムプログラミングを学んでいます。テキストファイルを読み込んで単語を小文字で出力しようとしています。英字以外の文字はすべて区切り文字になります。以下の出力を取得しています。誰かが私のコードを見て、単語間の行を削除する方法についてのヒントを教えてもらえますか? ありがとうございました!

これが私のテキストファイルの始まりです:

The Project Gutenberg EBook of The Iliad of Homer, by Homer

この eBook は、誰でもどこでも無料で、ほとんど制限なく使用できます。この電子ブックまたはオンライン www.gutenberg.org に含まれるプロジェクト グーテンベルク ライセンスの条件に基づいて、コピー、譲渡、または再利用することができます。

タイトル: ホメロスのイリアス

作者:ホーマー

翻訳者: Andrew Lang, MA, Walter Leaf, Litt.D., And Ernest Myers, MA

投稿日: 2012 年 1 月 14 日 [EBook #3059] リリース日: 2002 年 2 月

言語: 英語

これが私の出力です: ホメロスのイリアスのプロジェクトグーテンベルク電子ブック

ホーマーによって

この電子ブックは、誰でもどこでも無料で、ほとんど制限なく使用できます。

あなたはそれをコピーすることができます

この電子ブックに含まれているプロジェクト グーテンベルク ライセンスの条件の下で、または www グーテンベルク org でオンラインで、譲渡または再利用してください。

題名

ホメロスのイリアス

著者

ホーマー

翻訳者

アンドリュー・ラング

ウォルター・リーフ

リット・ド

アーネスト・マイヤーズ

郵送日

一月

電子ブック

発売日

2月

言語

英語

..........

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>

#define SIZE 256

int end_line(FILE *file, int c)
{
    int endLine = (c == '\r' || c == '\n');

    if (c == '\r')
    {
        c = getc(file);
        if (c != '\n' && c != EOF)
            ungetc(c, file);
    }

    return endLine;
}

int get_word(FILE *file, char *word, size_t wordSize)
{
    size_t i = 0;
    int c;

    //skip non-alpha characters
    while ((c=fgetc(file)) != EOF && !isalpha(c) && isspace(c)){
        ;   //do nothing
    }

    if (c != EOF)
        word[i++] = c;

    //read up to the next non-alpha character and store it to word
    while ((c=fgetc(file)) != EOF && i < (wordSize - 1) && isalpha(c) && !end_line(file, c))
    {
        c=tolower(c);
        word[i++] = c;
    }
    word[i] = 0;
    return c != EOF;

}

//Main Function
int main (int argc, char **argv)
{
    char *input = argv[1];
    FILE *input_file;
    char word[SIZE];

    input_file = fopen(input, "r");

    if (input_file == 0)
    {
        //fopen returns 0, the NULL pointer, on failure
        perror("Canot open input file\n");
        exit(-1);
    }
    else
    {
        while (get_word(input_file, word, sizeof(word)))
        {
            //do something with word;
            printf("%s\n", word);
        }
    }

    fclose(input_file);

    return 0;
}
4

1 に答える 1

1

printf("%s\n", word);\nは、改行文字を表すエスケープ シーケンスです。それが改行文字の由来です!

句読点の後にスペースが続く場合の余分な改行については、こちらを詳しく見てください。

//skip non-alpha characters
while ((c=fgetc(file)) != EOF && !isalpha(c) && isspace(c)){

コメントは疑わしいコードと一致しません。while() テスト内で多くのことが行われていることも疑わしいです。このような簡潔なコードを記述しても意味がありません。デバッグが難しくなるだけです。なんらかの理由で、一部の C プログラマーは読めないコードを書くのが好きですが、それらを真似してはいけません。:)

于 2013-08-07T06:04:33.633 に答える