こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

お世話になります

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

投稿日時 - 2011-01-14 02:52:07

QNo.6446470

すぐに回答ほしいです

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

ポインタとかアドレスとか、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++) )とか。

投稿日時 - 2011-01-14 07:39:49

補足

解答ありがとうございます。

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

投稿日時 - 2011-01-14 11:32:36

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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"); //もしもを考えて二段構えですノ。

投稿日時 - 2011-01-14 09:02:57

お礼

非常に見やすい解答をありがとうございます。

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

投稿日時 - 2011-01-14 11:35:53

ANo.2

> 実際に皆さんが改行文字を探して、置換する際にはどのようになさるのでしょうか?

実際にはファイル処理周りにもエラー処理が入りますが、こんな方法ですね。

char line[256];
FILE *fp = fopen(....);
char *p;
fgets(line, 256, fp);
p = strchr(line, '\n');
if(p != NULL) *p = '\0';

投稿日時 - 2011-01-14 07:35:46

お礼

解答ありがとうございます。

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

投稿日時 - 2011-01-14 11:28:12

ANo.1

それのやりかたでいいはずですが?

考え方は正しいけど、その仕様通りにプログラミングできてないように思います。
具体的にどんなプログラムを書いたのですか?

質問文で気になるのは「文字変数のアドレス」というのが何を表しているか、です。

投稿日時 - 2011-01-14 06:12:58

お礼

返信ありがとうございます。

 自分でこの質問ページが閉じられなかったので開けっ放しになっていた
のですが、一応解決はできました。ただその方法は、変数をもう一つ作って
その変数に文字をコピーしていく方法で解決しました。アドレスという表現
が不適格だったと思いますが、自分の意味したアドレスはポインタの値のこ
とです。取得方法はstrというcharの配列に格納した文字列に対して

 for(i=0;;i++){
if(*(str+i)=='/n') {
*(str+i)='\0';
break;
}
と言う方法でiを置換したい文字列のポインタとして取得しました。上の置換
動作は警告がでてうまくいかなかったものです。

 すでに問題は解決?したので重要度は低くなりましたが、実際に皆さんが改行
文字を探して、置換する際にはどのようになさるのでしょうか?

投稿日時 - 2011-01-14 06:41:41

あなたにオススメの質問