• ベストアンサー

fgetsで拾われる改行文字を削除したい

お世話になります  C言語初心者のものです。今課題でC言語を用いたプログラミングを Fedora上でやっています。問題は、fgetsでテキストファイルから、取得 した文字列の中から改行文字を削除できないことです。文字変数のアド レスはわかっているのですが、終端文字に置換しようとすると、セグメ ントエラーになってしまいます。これは如何にして解決すべきでしょう か。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。 「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。 「文字変数のアドレス」だと char c ; に対しての &c が思い浮びます。 配列なら「添字」、意味的には「x文字目」ですね。 > for(i=0;;i++){ > if(*(str+i)=='/n') { > *(str+i)='\0'; > break; > } > } /nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。 fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる) ・そのような状態になってないか、予めチェックする ・ループを終了させる仕組みを用意しておく : forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等 といった対策が必要です。 あと細かいところを言えば ・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな ・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

kfnorisu
質問者

補足

解答ありがとうございます。  ご指摘のとおり、終了条件の記述が不足していました。たぶんこれが原因 だったと思います。用語の言い回は勉強しなおします。また配列の書き方に ついては、参考にしていたサイトで多かった書き方で書いたのですが、自分 も配列を用いて書いた方が好きなので、配列を使用して書くことにします。 適切な指摘をありがとうございます。

その他の回答 (3)

回答No.4

> 実際に皆さんが改行文字を探して、置換する際にはどのようになさるのでしょうか? fgets()関数で読み込んだ文字列の末尾は、\n を \0 にするということで簡単な strtok()関数を愛用してます。 http://www9.plala.or.jp/sgwr-t/lib/strtok.html char buff[256]; FILE *fp = fopen(....); fgets(buff, 256, fp); strtok(buff, "\n\0"); //もしもを考えて二段構えですノ。

kfnorisu
質問者

お礼

非常に見やすい解答をありがとうございます。 このやり方は初めて拝見しました。素人目ではありますが、ソースがすっきり するのでこの方法を使わせてもらいます。ただ、質問の要旨から、ベストアン サーは他の方につけさせて頂きます。ありがとうございました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> 実際に皆さんが改行文字を探して、置換する際にはどのようになさるのでしょうか? 実際にはファイル処理周りにもエラー処理が入りますが、こんな方法ですね。 char line[256]; FILE *fp = fopen(....); char *p; fgets(line, 256, fp); p = strchr(line, '\n'); if(p != NULL) *p = '\0';

kfnorisu
質問者

お礼

解答ありがとうございます。 strchrで探せるんですね。ありがとうございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

それのやりかたでいいはずですが? 考え方は正しいけど、その仕様通りにプログラミングできてないように思います。 具体的にどんなプログラムを書いたのですか? 質問文で気になるのは「文字変数のアドレス」というのが何を表しているか、です。

kfnorisu
質問者

お礼

返信ありがとうございます。  自分でこの質問ページが閉じられなかったので開けっ放しになっていた のですが、一応解決はできました。ただその方法は、変数をもう一つ作って その変数に文字をコピーしていく方法で解決しました。アドレスという表現 が不適格だったと思いますが、自分の意味したアドレスはポインタの値のこ とです。取得方法はstrというcharの配列に格納した文字列に対して  for(i=0;;i++){ if(*(str+i)=='/n') { *(str+i)='\0'; break; } と言う方法でiを置換したい文字列のポインタとして取得しました。上の置換 動作は警告がでてうまくいかなかったものです。  すでに問題は解決?したので重要度は低くなりましたが、実際に皆さんが改行 文字を探して、置換する際にはどのようになさるのでしょうか?

関連するQ&A