- 締切済み
C 単語 読みとり 比較 辞書
英語のつづりをチェックするプログラムがつくりたいのですが、うまくいかないのでどなたかご教授いただけると幸いです。 言語:C言語 OS:UNIX (1)指定されたテキストファイルを読み込む。 (2)自分で作った辞書ファイルの中に有る単語と比較する。 辞書ファイル各行に1単語のみ。単語の終わりには¥nが行変換のために必ずつけられてるとする。 (3)もし、辞書ファイルに登録されている単語であれば次の単語へ。 そうでなければ出力として表示する。 (4)付加機能として辞書ファイルの指定、大文字で書かれた単語を無視する機能をつける。 例)プログラムの名前をenglishとすると english textfile english capital textfile english capital dictionaryfile textfile だいたいの感じは伝わったでしょうか?? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- beefisdead
- ベストアンサー率63% (92/145)
つまり、オプションの付け方をどうしようかで悩んでいらっしゃると言うことですね。 指定テキストファイルは必ず記述するんですから、そのまんま書く方が良いですね。 辞書ファイルについては、 gcc の -o オプションのようにしてみてはいかがでしょう? [-d DictionaryFile] という具合に、 -d オプションの後ろに来た文字列は辞書ファイル名と判断させるんです。perl の -e オプションなんかも似たような形式ですね。 あと、大文字無視のオプションは -C とか言った形式にした方が分かりやすいんじゃないかと思います。 $ english [-C] [-d DictionaryFile] TextFile 一つの提案ですが、こんな方法もあると言うことで。
- tatsu99
- ベストアンサー率52% (391/751)
>english textfile [-Ccapital] [-Ddictionaryfile] >第3パラメータ以降で先頭が-Cならcapital -Dならdictionaryfile >が指定されたことにすれば良いでしょう。 のつづきですが >例として、もしユーザーがdictionaryfileの名前を”jisyo”としたら >english capital jisyo.txt textfile.txt >このような風になります。 これを english textfile.txt -Ccapital -Djisyo.txt と入力させて 第3パラメータは-Cで始まるので、最初の-Cを削除し、 capitalが指定されたとみなす 第4パラメータは-Dで始まるので、最初の-Dを削除しjisyo.txtが指定されたとみなす という意味です。 一般的には、オプションが最初にくるので [-Cxxx] [-Dyyy] english textfileの方が、見栄えは良いですが、 その分引数の処理が面倒になるので english textfile [-Cxxx] [-Dyyy] の形式で良いかと思います。
- tatsu99
- ベストアンサー率52% (391/751)
>今わからないのはenglish capital textfileのようにtextfileが必ずしも2番目の位置にないので、どのようにしてtextfileを指定するのかがわかりません。 考え方をかえて english [capital] [dictionaryfile] textfile の指定方法を english textfile [capital] [dictionaryfile] にしてはいかがですか パラメータ数が2つなら、english textfile パラメータ数が3つなら、english textfile capital パラメータ数が4つなら、english textfile capital dictionaryfile ではだめですか? もし、パラメータ数が3つで、english textfile dictionaryfile を指定したいなら例として以下のようにします。 english textfile [-Ccapital] [-Ddictionaryfile] 第3パラメータ以降で先頭が-Cならcapital -Dならdictionaryfile が指定されたことにすれば良いでしょう。
補足
>english textfile [-Ccapital] [-Ddictionaryfile] >第3パラメータ以降で先頭が-Cならcapital -Dならdictionaryfile >が指定されたことにすれば良いでしょう。 説明が不十分でした。 capitalの場合はそれでもかまわないのですが、dictionaryfileの部分はユーザーが指定する辞書ファイルの名前が打ち込まれます。 例として、もしユーザーがdictionaryfileの名前を”jisyo”としたら english capital jisyo.txt textfile.txt このような風になります。 説明不足で申し訳ありませんでした。
- beefisdead
- ベストアンサー率63% (92/145)
作成内容はだいぶ具体的になっているようですね。 どのように考えて、何が分からないのか、補足をお願いします。 とりあえず、使う関数は fopen fgets fseek fclose あたりです。 あとstrcmpだと改行文字の扱いがちょっと面倒だから、自前で文字列の比較関数を作ってしまった方が楽ですね。
補足
今わからないのはenglish capital textfileのようにtextfileが必ずしも2番目の位置にないので、どのようにしてtextfileを指定するのかがわかりません。 int main(int argc, char* argv[]){ char text[102]; char dic[52]; dic[] = "~/usr/dictionary/"; char *tp; int english(FILE *fp_text, FILE *fp_dic){ if (argc 2 <||> 5 argc){ printf("this is error\n")} switch(argc){ case 1: /* no argument is supplied */ fgets(buf, 102, fp_text) if ((fp_text = fopen(argv[1], "r")) == NULL) {printf(stderr, "english: file %d can not be opened\n", argv[1]); break; } else while (fgets(buf, 102, fp_text) != NULL) { /*read each line untill the end*/ char *dest; dest = strtok( buf, " ,:" ); while ( dest != NULL ) { dest = strtok( NULL, " ," ); if (dest != NULL) strcmp(dest, fp_dic); } } fclose(fp); /* close the file */ return 0; } case 2: /* argument is capital */ if(strcmp(argv[1],"capital") == 0){ fgets(argv[0], 102, fp_text) if ((fp_text = fopen(argv[1], "r")) == NULL) { printf(stderr, "english: file %d can not be opened"/n, argc); exit(4); break; } else while (fgets(text, 102, fp_text) != NULL) { fgets(text, 102, fp_text) /*read each lines untill the end*/ char *dest; dest = strtok( buf, " ,:" ); while ( dest != NULL ) { dest = strtok( NULL, " ," ); if (dest != NULL) strcasecmp(dest, fp_dic); } } fclose(fp); /* close the file */ return 0; break; } case 3 /* dictionary file is defined */ fgets(argv[0], 52, fp_dic) if((fp_dic = fopen(argv[1], "r")) == NULL) { printf(stderr, "english: dictionary file %d can not be opened"/n, argc); exit(3); } else tp = strtok( str, " ." ); while ( tp != NULL ) { tp = strtok( NULL," ." ); if ( tp != NULL ) if (strcmp( tp,argv[1] ) == 0){ puts(tp); } }
- asuncion
- ベストアンサー率33% (2127/6289)
> 例)プログラムの名前をenglishとすると > english textfile > english capital textfile > english capital dictionaryfile textfile これらの3つの実行例が、どの機能と対応していますか? オプションのtextfileは、指定するテキストファイルのことですか? capitalは、大文字を無視する、という意味のオプションですか? dictionaryfileは、指定する辞書ファイルのことですか? english dictionaryfile textfile という実行例はあり得ますか?あり得る場合、 english textfile との違いはどこにありますか?
補足
>これらの3つの実行例が、どの機能と対応していますか? >オプションのtextfileは、指定するテキストファイルのことですか? >capitalは、大文字を無視する、という意味のオプションですか? >dictionaryfileは、指定する辞書ファイルのことですか? はい、全てその通りです。 >english dictionaryfile textfile >という実行例はあり得ますか? この実行例もあり得ます。 >english textfile >との違いはどこにありますか? この場合はtextfileと自分で作成したデフォルトの辞書ファイルと比較しますが、dictionaryfileが指定されていればその辞書ファイルと比較します。 補足 english [capital] [dictionaryfile] textfile []の中のものはオプションです。 dictionaryfile:ここには実際に指定する辞書ファイルの名前がはいります。 textfile:辞書ファイルと比較するファイル。これも上と同じで実際にはファイルの名前をタイプします。
補足
>english textfile.txt -Ccapital -Djisyo.txt >と入力させて >第3パラメータは-Cで始まるので、最初の-Cを削除し、 capitalが指>定されたとみなす >第4パラメータは-Dで始まるので、最初の-Dを削除しjisyo.txtが指>定されたとみなす ううん。。。 自分としてはそのまま辞書ファイルはそのままの名前でタイプしてもらう方がいいなぁと思っています。 でも、この考え方は思いつかなかったのでぜひ参考にさせていただきます。 ご意見ありがとうございます。