ショボ短歌会

こんにちわ、いつもお世話になっております。
今日からc言語の勉強をはじめました。聞きたいことがあります。

英語を海賊語に変換するプログラムを書いています。

そこで、まず辞書というインプットファイルを読み込みました。
フォーマットは次のようになっています。(左が英語、右が海賊語)

hello;ahoy
hi;yo-ho-ho
pardon me;avast
excuse me;arrr

これを一行読んで、; で区切り 英語をeng[] に海賊語をpir[]に入れたいのですが。
調べるとfscanf(ファイル、フォーマット)という関数を見つけて、これだとフォーマットにそって、一行ずつ読んでくれるというのがわかりました。

そこで。
;で区切ったフォーマットを使いたいのですが、
char eng[30];
char pir[30];
while((fscanf(fp,"%s ;%s", eng, pir))!=EOF){
printf("English : %s", eng); //英語だけを表示する。

fpはファイルです。
}

と書いてみたのですが、おもいっきりスペースで区切られていて、;で区切ってもらえませんでした。フォーマットの書き方が悪いのは分かります。もうあほ過ぎて話しにならないですよね。けれども、何かもっと良い関数やアイディアはありませんか?

関係ないですけど。C勉強してJAVAがものすごい大好きってことに気づきました(´;ω;`)。

A 回答 (3件)

エラー処理を考慮しないのであれば...



fscanf(fp, "%29[^;];%29[^\n]%*c", eng, pir)

のようにすれば実現できます。
    • good
    • 0
この回答へのお礼

できました!!!これだけで3時間くらい悩んだのに。。。ありがとうございました^^

お礼日時:2011/09/22 09:53

> 調べるとfscanf(ファイル、フォーマット)という関数を見つけて、これだとフォーマットにそって、一行ずつ読んでくれるというのがわかりました。



「一行ずつ読む」というのは嘘、あるいは、初心者用に詳細を省略したいい方です。fscanfでは、実際は、殆どの場合で改行は空白と同じあつかいになります。

フォーマット文字列がわからないのなら、リファレンスマニュアルの該当項目をよく読みましょう。

他の言語の経験があるのなら、思い込みでCのプログラミングをするのは、とても危険なことです。
だから「マニュアルを読みましょう」質問はそのあとです。

特に、Javaの経験があるのなら、中途半端に似ているだけに、きちんと分けて覚えないと。


Javaでは意識しないでよかった、文字列操作やメモリ管理が重要になってきます。


その意味では、なぜ「今日から始めました」でこんな内容なのかが気になります。もうちょっと基礎の勉強をしてもよいのでは?


> 関係ないですけど。C勉強してJAVAがものすごい大好きってことに気づきました

言語論争するつもりはないですが、こんなこと言うならJavaでやりゃいいじゃん、ってなりませんかね?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
フォーマットを読んだのですが、よくわからなかったので質問させていただきました。

これは、私が好きでやっているのではなくて、学校で出された課題についての質問です。授業が始まってすぐ出されて、自分でCを勉強しながら3日で仕上げなくてはいけないプログラムなので、基礎をしっかりと。。というのは分かるのですが、他のプログラムも書かなければいけないので、はっきりいって時間がありません。

Javaで全部かけるなら、最初から書いてます(´・ω・`)

fscanfでは、殆どの場合で改行は空白と同じあつかいになる事がわかりました、ありがとうございました。

お礼日時:2011/09/22 09:45

これくらい(一行読んで分割)ならfgetsで読んでstrtokでもOKでしょう。

    • good
    • 0
この回答へのお礼

strtok()という関数があるんですね。これはこれからも使えそうなので、調べて、機会があればこのプログラムの中で使ってみたいと思います。Cはメモリーの事よくも考えないといけないんですね、、、難しいです。。。

ありがとうございました^^

お礼日時:2011/09/22 09:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!