- ベストアンサー
もし良ければ見て下さい
例えば、「in」を入力すれば、食わせたファイル内の「in」を含む行を全て出力するプログラムを作りました。 しかし、 (1)このファイル自身を食わせて「*」を入れると関係ない行まで出力される。 (2)このファイル自身を食わせて「re」を打つと空白の行しか出力されない (どうして「return(0); 」が出力されない?) のです。 もし良ければこのプログラムを見て、ご指摘ください。 #include<stdio.h> int main(int argc,char **argv) { FILE *file1; int i,nagasa; char line[256],*p,*q,*r; file1=fopen(argv[1],"r"); for(p=argv[2],nagasa=0;*p;++p,++nagasa); while(fgets(line,256,file1)!=NULL) { for(p=line,i=0;*p!='\0';++p) { for(q=argv[2];*q;++q) { while(*p!=*q && *p!='\0')++p; if(*p!='\0' && *q!='\0') { for (i=0;*q==*p;++p,++q,++i); } } } if(i==nagasa) for(p=line;*p!='\0';++p) printf("%c",*p); } return(0); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>アドバイスありがとうございます。 >「argv[1]」というファイルを1行ずつ読み込んで行く際、、読み込む停止条件を「*p='\n'」とする必要はありますか?(そこが一番分からないんです・・・・・) 改行文字を意識する必要はありません。単に普通の一致しない文字とみなせばいいだけなので。 逆に、最終行に改行が入っていないファイルを読み込んだときの動作がおかしくなりそうです。 がんばっているみたいなのでヒントのヒントを >iを初期化する場所と、 if(i==nagasa) のところで、iが初期化されないうちに判断が行われたり、1行前の結果が iに入っている状態で判断が行われる可能性があります。 >for(q=argv[2];*q;++q) >のループの必要の有無を考えてみましょう。 行の内容を"abcdef"、argv[2]を"cde"とします。 cdeが行の中で検索されたあとに、deとeを検索する必要はないですよね。 あとは、ここですかね。 while(*p!=*q && *p!='\0')++p; ここで++pが行われる条件は、 行の内容が"aaabcd"、argv[2]が"ab"というときですよね。 それではまずいので、qもインクリメントする必要がありそうです。 最後にもうひとつ。 argv[2]が"ab"のとき、"acab"がちゃんと出力されるようにしてあげてくださいね。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
失礼しました。 >>iを初期化する場所と、 >if(i==nagasa) >のところで、iが初期化されないうちに判断が行われたり、1行前の結果が >iに入っている状態で判断が行われる可能性があります。 for(p=line,i=0;*p!='\0';++p) ここの行でiの初期化はいっていましたね。見落としてました。 なお、このforループの終了条件ですが、あってますよ。
- Esna
- ベストアンサー率36% (4/11)
こんにちは.Esnaです. 見た感じでは,for文の条件がいけないのでは,ないでしょうか. 例えば, for(p=line,i=0;*p!='\0';++p) ですが,for文の処理は,確か for(1;2;3){ 4; } のときに, 1->2->4->3->2->4->… と動くはずですが,chikako-imagawaさんのプログラムでは,pが記号列終端を指した後に,for文の3が行われて,pが訳のわからないとこをさしているので,2の条件式が働いていないように思います. for(q=argv[2];*q;++q) も同じようなことになってます. バグがあるかも知れませんが,見た感じとしては, } } if(*p == '\0') break; } if(i == nagasa… の2行を入れてみたらいいんじゃないかと思います.
お礼
アドバイスありがとうございます。 じつは大学のC-padは「break」が効かないんです・・・・ その場合はどうしたらいいでしょう?
- taka_tetsu
- ベストアンサー率65% (1020/1553)
まずは、自分でデバッグをしてみましょう(^^;; いろいろと問題ありそうですし。 一応ヒントを。 iを初期化する場所と、 for(q=argv[2];*q;++q) のループの必要の有無を考えてみましょう。
お礼
アドバイスありがとうございます。 「argv[1]」というファイルを1行ずつ読み込んで行く際、、読み込む停止条件を「*p='\n'」とする必要はありますか?(そこが一番分からないんです・・・・・) 今日学校でもう一度考えてみます。 ありがとうございます。
補足
いろいろありがとうございました。できました。 「 #include<stdio.h> int main(int argc,char **argv) { FILE *file1; int i=0,nagasa,kenchi=0,x=0; char line[256],*p,*q,*r; file1=fopen(argv[1],"r"); for(p=argv[2],nagasa=0;*p;++p,++nagasa);--nagasa; while(fgets(line,256,file1)!=NULL) {++x; for(p=line,i=0;*p!='\0';) { for(q=argv[2];*q;++q) { while(*p!=*q && *p!='\0')++p; for(i=0;*q==*p && *p!='\0' && *q!='\0';++p,++q,++i)if(i==nagasa)kenchi=1; } } if(kenchi==1) for(p=line;*p!='\0';++p) { printf("%c",*p); kenchi=0; } } return(0); } 」 てな感じです。 「+」と「[ - ]」と「.」が使えるようにもう少しがんばります!