質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2103閲覧

[C言語] fgets関数において値を格納するbufのメモリについてご教示願います。

apeirogon0813

総合スコア117

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/10/23 02:29

以下のような配列buf[]とfgets関数を用いて行ごとに文字を読み込むようにするのですが、
次の行を読み込む際すでにbuf[]に格納されているデータはリセットされるのでしょうか?
試しに前後で出力してみたところ前のデータは残っていなさそうでした。

C

1char buf[128]; 2fgets(buf,sizeof(buf),stdin); 3fgets(buf,sizeof(buf),stdin); 4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fgetsでそのバッファの内容は上書きされます

まあ、上書きされない範囲のデータはそのまま残ってるんじゃないかと思いますが

投稿2018/10/23 02:33

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apeirogon0813

2018/10/23 02:41

書きされない範囲のデータはそのまま残ってるのかか知りたかったです。
y_waiwai

2018/10/23 02:43

おそらく、残ってるものとは思われますが、そこらへん明文化されていないため、そのデータが使えるとは限らないというのに注意しましょう
退会済みユーザー

退会済みユーザー

2018/10/23 02:46

書ききれないではなく、バッファに入りきらない。の間違いでは? 質問者さんがまず試してみればよいのでは……
tacsheaven

2018/10/23 02:51

ISO による定義だと、「A null character is written immediately after the last character read into the array」とあるので、終端の null は書き込みますが、そこよりさらに先のバッファ領域については動作未定義ですね。 ※そもそも C で配列のサイズって実行中に保持してるとは限らないので、どこまで消していいのかも分からない可能性が大きいですが
tatsu99

2018/10/23 02:54

1行単位で読み込むので、改行文字('\n')までは、上書きされます。改行文字の後ろは、前の内容が残ります。1行がbufのサイズを超える場合は、bufの全てが上書きされます。
tatsu99

2018/10/23 02:59

すみません。正確には、改行文字の後には、NULL('\0')が付加されるので、NULLの後ろは、前の内容がの切ります。・・・・になります。
apeirogon0813

2018/10/23 03:00

すみません誤字で上書きされない範囲のデータは...でした。 なるほど、やはり改行文字の後ろは、前の内容が残っているようでした。
y_waiwai

2018/10/23 03:06

おそらく、データは残ってるとは思いますが、 他の環境に流用するとか、コンパイラ(ライブラリ)のアップデートやらで、 ある日突然残らなくなった、とか、変なデータに上書きされてた、とかなっても文句は言えないのでそこらへん注意を。
apeirogon0813

2018/10/23 03:48

ありがとうございます。参考にします。
退会済みユーザー

退会済みユーザー

2018/10/23 03:57

仕様などが気になった際は、2次情報的な記事を参考にするのではなく、 >ISO による定義だと、「A null character is written immediately after the last character read into the array」とあるので、終端の null は書き込みますが、そこよりさらに先のバッファ領域については動作未定義ですね。 とあるように、大本の仕様を定義しているようなものを読むのが良さそうですね。
tacsheaven

2018/10/23 04:21

C言語の場合は ISO の日本語訳したものが JIS X3010 として規格化(最新は JIS X3010:2003)されているので、これを見るのが手っ取り早いですけどね(手持ちに ISO の方があったのでそっち見ましたが) ちなみに JIS では 「そして,最後に配列に格納した文字の後にナル文字を書き込む。」となっています。この文脈だとナル文字以後は何もしない、と取るのが正しいでしょうが、保証しているわけではないですね。
退会済みユーザー

退会済みユーザー

2018/10/23 04:44

tacsheavenさんのような情報、学校で教えてほしかったことランク上位に入る気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問