- ベストアンサー
getcの改行判定
Windowsの構文解析でgetcを使ったプログラムを作ったのですが、 改行の判定に c = getc(fp_in); if(c == '\n'); とすると、 コマンドプロンプトに「コードは効果を持たない」と言われ、 コンパイルして実行してもif文は真にならないみたいです。 改行の判定を行うには正しくはどう記述すればいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
正直言、現在開示されている情報だけでは 「開示されていない箇所でなにかおかしいところがある」 「開示した情報が実際のものと違いすぎて参考にならない」 「確かめかたが間違っていて実際の状況と違う」 「fp_inの入力ファイルに改行がない(少なくとも、CRLFまたはLFは使われていない)」 のどれかだ、としか言いようがありません。 既出ですが、 「エラーメッセージを正確に書く(できればコピペする)」 「その警告箇所周辺のソースコードをコピペする」 とでもしてもらわないと、アドバイスのしようがありません 改行コードが特殊なものでなければ、判定は c=='\n' で問題無いはずです。 例えば、下のソースを test.c というファイル名で保存してコンパイル→実行したら、どうなります? #include <stdio.h> int main() { int c; FILE *fp_in = fopen("test.c","r" ) ; if ( fp_in == NULL ) { return 1; } for(;;){ c = getc(fp_in) ; if ( c == EOF ) { printf("\nEnd of file\n"); break ; } if ( c == '\n' ) { printf("\nEnd of line\n"); break ; } putchar(c) ; } return 0 ; }
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
警告は出ても問題ないケースもあるけれど、やはり出ないようにプログラムを書くのが上達への一歩。 発生箇所はちゃんと近くに書いてあります。(括弧の不対応など、発生箇所と原因が離れている場合もありますが) エラーメッセージの内容と、ifが成立しないということから推測すると c == getc(fp_in); になっている可能性の方が高そうですね > #2さん 手許のVisualStudio2005で実験コード書いてやってみたら、似た警告が出ました。 さらに、その後に「==は=ではないですか?」と修正のヒントまで表示されました。
補足
コンパイルはborlandを使用しています。 あとc = getc(fp_in);は代入です。 今のところc == '\n'という記述で改行は判定できないのでは?というのが考えです。
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと.... 質問文がハチャメチャ.... まず if(c == '\n'); と if(c == '\n') break; は全然意味が違うわけだから, なぜわざわざ後者を見せないで前者の形で質問したのかが分からん. あと, 「コマンドプロンプトに『コードは効果を持たない』と言われ」も意味不明. たしかにコマンドプロンプトで出てくるメッセージは謎なこともあるけど, それにしてもこんな謎のメッセージは出ない. とりあえず ・どういう操作をしてどんなメッセージが出たのか ・そのメッセージはプログラムのどの部分に対して出ているのか を正確に出してください. あと, 当該部分で使っている変数があればその宣言も念のため正確に書いてください. 今出ている情報だけだとあまりにも不正確なので「質問文では == になってるけど, 実はプログラムでは = と書いている」という疑いを捨てきれないのよ....
補足
if文が真にならない原因が知りたかったので、 c =(代入演算子です) getc(fp_in); if(c ==(関係演算子です) '\n') 真の場合(略); と省略しました。分かり難くて申し訳ないです。 現状では、 ・if文が偽になっていることは確認済み ・警告はc == '\n'に対して出ている (getcが改行を読み込んだ場合 c == '\n'では改行判定にならない、 又は記述が正しくない?) 要するにgetcが改行を読み込んだ場合、 ・改行を判定するにはどう記述すればいいのか? を聞きたいのです。
- hitomura
- ベストアンサー率48% (325/664)
>if(c == '\n'); 上記のコードのとおりであるならば、cの値がいくつであろうと何も行いません。 正確には、 (1)cの値が'\n'以外の場合:括弧以降の文の終わりの次まで進む (2)cの値が'\n'場合:括弧以降の文を処理するも、その文が ; のみなので何もせず次の文に進む という処理を行います。 あるいは、コンパイラが生成した実行ファイルでは最適化によってこの処理自体が消えている可能性があります。
補足
いえ実際にはifが真である場合にはbreakでループを抜け出すように記述しています。 for(;;){ c = getc(fp_in); if(c == '\n') break; …(略) } それでどうしても改行でループが抜け出せないので、 記述の仕方が違うのかなということです。 説明不足ですみません。
お礼
#include <stdio.h> End of line 正しく判定が行われてますね。 ではc == '\n'という判定の仕方は正しいのですね。 ということは他の箇所に誤りがある様です。 回答して下さった方々どうもありがとうございます。 そして色々とご迷惑お掛けしてすみませんでした。 自分で再度ソースを見直してみます。