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 ------------------------------ */ |