解決済みの質問
質問:No.6446470
すぐに回答ほしいです
お気に入り投稿に追加する (0人が追加しました)
回答数4
閲覧数2570
fgetsで拾われる改行文字を削除したい
お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。
投稿日時 - 2011-01-14 02:52:07
質問者が選んだベストアンサー
回答: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++) )とか。
投稿日時 - 2011-01-14 07:39:49
この回答を支持する
(現在0人が支持しています)
補足
解答ありがとうございます。

 ご指摘のとおり、終了条件の記述が不足していました。たぶんこれが原因
だったと思います。用語の言い回は勉強しなおします。また配列の書き方に
ついては、参考にしていたサイトで多かった書き方で書いたのですが、自分
も配列を用いて書いた方が好きなので、配列を使用して書くことにします。
適切な指摘をありがとうございます。
投稿日時 - 2011-01-14 11:32:36
この質問は役に立ちましたか?
2人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答: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"); //もしもを考えて二段構えですノ。
投稿日時 - 2011-01-14 09:02:57
この回答を支持する
(現在0人が支持しています)
お礼
非常に見やすい解答をありがとうございます。

このやり方は初めて拝見しました。素人目ではありますが、ソースがすっきり
するのでこの方法を使わせてもらいます。ただ、質問の要旨から、ベストアン
サーは他の方につけさせて頂きます。ありがとうございました。
投稿日時 - 2011-01-14 11:35:53
回答:No.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
この回答を支持する
(現在0人が支持しています)
お礼
解答ありがとうございます。

strchrで探せるんですね。ありがとうございました。
投稿日時 - 2011-01-14 11:28:12
回答:No.1
それのやりかたでいいはずですが?

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

質問文で気になるのは「文字変数のアドレス」というのが何を表しているか、です。
投稿日時 - 2011-01-14 06:12:58
この回答を支持する
(現在0人が支持しています)
お礼
返信ありがとうございます。

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

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

 すでに問題は解決?したので重要度は低くなりましたが、実際に皆さんが改行
文字を探して、置換する際にはどのようになさるのでしょうか?
投稿日時 - 2011-01-14 06:41:41
もっと聞いてみる
関連するQ&Aはこちら
このような課題が出されました。 課題を丸投ではありませんが、どこをどう手をつけ始めればよいかわかりません。 お手数ですがよろしくお願いします。 次のような動作をするプログラムを作成する。 ファイルを...
テキストファイルで、「(オプション),」の後ろに改行を入れたいです。 置換を試しているのでうがうまくできないので教えて下さい! ...
プログラミング、C言語について・・・ 大学の宿題でわからないところがありまして・・・ 課題は、 キーボードから入力した数だけ、*(アスタリスク)を表示するようなプログラミングを作成せよ また、表示...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
カテゴリ:C・C++
RSS
-PR-
PR
-PR-