C言語関係掲示板

過去ログ

No.1063 スペースを無視して、単語ごとに出力したい

[戻る] [ホームページ]
No.13874

スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---とおこ(2004/05/07 23:15:31)


引数のファイルの中の文字列を、
任意のスペースやタブを区切りとして、単語に分けて出力するプログラムを作成したいのですが、
複数のタブやスペースがある場合、文字だけでなく、スペースやタブも出力してしまいます。
どのように書いたらよいのでしょうか?
ここから先、どうしても手が出ないのですが・・・


#include<stdio.h>

int main(int argc, char*argv[])
{
FILE *fp;
char ch;
int i;

i = 1;

if(argc != 2){
printf("error\n");
return 1;
}

fp = fopen(argv[1],"r");

if(fp == NULL){
printf("error\n");
return 1;
}

printf(" --LINE 1--\n");

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

if(ch != ' ' && ch != '\t' && ch != '\n'){
putchar(ch);

}
else{
if(ch == '\n'){
printf("\n --LINE %d--\n",i+1);
i = i+1;
}
else{
printf("\n");
}
}
}

fclose(fp);
return 0;
}


No.13876

Re:スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---nop(2004/05/07 23:28:47)


>引数のファイルの中の文字列を、
>任意のスペースやタブを区切りとして、単語に分けて出力するプログラムを作成したいのですが、
>複数のタブやスペースがある場合、文字だけでなく、スペースやタブも出力してしまいます。

ファイルのデータをすべてリードし、
strtok()でトークン分割していけばOK。


No.13877

Re:スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---とおこ(2004/05/07 23:44:44)


>ファイルのデータをすべてリードし、
>strtok()でトークン分割していけばOK。

ありがとうございます。
早速やってみます。

しかし…strtok()を使わずに書く方法って、無いのでしょうか?



No.13878

Re:スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---RAPT(2004/05/08 00:07:36)


strtok()でやっている処理を自前で書けばよい。


No.13879

Re:スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---nop(2004/05/08 00:40:01)


>しかし…strtok()を使わずに書く方法って、無いのでしょうか?

考え方次第で複数通りの答えが存在します。
strtok()を使わなくてもいくらでも方法はあります。
最もコードが短く簡単になるであろう答えを書いたまでです。

とりあえず、いきなりコードを考えるのではなく、

 「自分自身が同じ処理を行う場合はどう処理するか?」

を日本語で考えてみて下さい。
後は、それをCのコードに翻訳すれば良いのです。



No.13880

Re:スペースを無視して、単語ごとに出力したいのですが・・・
投稿者---nop(2004/05/08 01:41:10)


>しかし…strtok()を使わずに書く方法って、無いのでしょうか?

元投稿のソースを元に改造例を…。
テストはさらっとしかやってないですが、
大まかな流れは解っていただけるかな?

/* ----- ヘッダ組み込み ----- */
#include  <stdio.h>
#include  <ctype.h>
/* ----- 改行出力我慢フラグ定数値 ----- */
typedef enum
{
     FALSE = 0  /* 我慢しなくてもいいよ♪ */
    ,TRUE       /* 我慢しなさい!         */
} fixGamanFlag;


/* ------------------------------------------------------------
    関数名【 word_div() 】
        単語区切り表示処理関数
    処理概要
        指定ファイルの内容を空白文字を区切りとして単語に分割し
        分割した各単語を一行ずつ出力する
    引数
        1) aFileName : 読み込みファイル名
    戻り値
        なし
------------------------------------------------------------ */
void  word_div( char *aFileName )
{
    /* ----- 内部変数定義 ----- */
    FILE         *iFp;
    fixGamanFlag  iGamanFlag = TRUE;    /* 改行出力我慢フラグ */
    int           iCh = '\n';
    int           iLine = 0;

    /* ----- ファイルを開く ----- */
    iFp = fopen( aFileName, "r" );

    if( iFp!=NULL ) /* ファイルは開けたか? */
    {
        while( iCh!=EOF )   /* ファイルの終了までループ */
        {
            if( iCh=='\n' ) /* 行数の出力か? */
            {
                /* ----- 行数出力 ----- */
                printf( " --LINE %d--\n", ++iLine );
            }
            /* ----- 一文字読み込み ----- */
            iCh = fgetc( iFp );

            if( iCh!=EOF && !isspace(iCh) ) /* 空白以外か? */
            {
                /* ----- 入力文字を出力 ----- */
                fputc( iCh, stdout );
                /* ----- 次からは改行出力は我慢しなくてもいいよ♪ ----- */
                iGamanFlag = FALSE;
            }
            else
            {
                if( !iGamanFlag )   /* 改行出力は我慢しなくてもよいか? */
                {
                    /* ----- 改行を出力 ----- */
                    fputc( '\n', stdout );
                    /* ----- 次からは改行出力を我慢するように指示 ----- */
                    iGamanFlag = TRUE;
                }
            }
        }
        /* ----- ファイルを閉じる ----- */
        fclose( iFp );
    }
    else
    {
        /* ----- エラー表示 ----- */
        fprintf( stderr, "ファイル開けネェヨ!\n" );
    }
} /* ----- word_div() ----- */

/* ------------------------------------------------------------
    関数名【 main() 】
        プログラムエントリポイント
    処理概要
        プログラムのエントリポイント
        コマンドライン引数を判定し単語区切り処理を起動する
    引数
        1) argc : コマンドライン引数個数
        2) argv : コマンドライン引数文字列群
    戻り値
        0
------------------------------------------------------------ */
int  main( int argc, char **argv )
{
    if( argc==2 )   /* ファイル名の指定有り? */
    {
        /* ----- 単語を分割して出力 ----- */
        word_div( argv[1] );
    }
    else
    {
        /* ----- エラー表示 ----- */
        fprintf( stderr, "ファイル指定しろゴルァ!\n" );
    }
    return 0;
} /* ----- main() ----- */
/* ------------------------------ End_of_File ------------------------------ */