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

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

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

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

Q&A

解決済

2回答

3395閲覧

【C】fgets() != NULLが正常に機能しない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2022/02/04 11:25

while (fgets(buf, 256, stdin) != NULL)でfgetsで読み込めなかった場合NULLポインタを返してほしいのですが、なぜか何も入力しなくてもアドレスが返ってきしまいます。これはどういう不具合でしょうか?

該当コード

c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void) 5{ 6 char buf[256]; 7 int size = 0; 8 int *var_ary = NULL; 9 int i; 10 11 while (fgets(buf, 256, stdin) != NULL) 12 { 13 size++; 14 var_ary = realloc(var_ary, sizeof(int) * size); 15 printf("%p\n", &buf[size - 1]); 16 sscanf(buf, "%d", &var_ary[size - 1]); 17 } 18 19 for (i = 0; i < size; i++) 20 { 21 printf("var_ary[%d] = %d\n", i, var_ary[i]); 22 } 23 24 return 0; 25} 26

出力結果

1
0x7ff7b5f0b620

0x7ff7b5f0b621

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

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

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

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

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

maisumakun

2022/02/04 12:01

> 何も入力しなくてもアドレスが返ってきしまいます。 どの挙動から、そう判断したのですか?
退会済みユーザー

退会済みユーザー

2022/02/04 12:06

出力結果の空白の行は何も入力せずenterを押したところで判断しました。。ここではNULLが返されると思うのですが予測通りにはいきませんでした。
guest

回答2

0

それは不具合でなく仕様です。
何も入力せず return または enter キーを押した場合にも改行文字は入力されており、 fgets 関数はその改行文字一文字だけを読み取ります。
意図した挙動にするためには改行文字以外が読み取られなかった場合について処理することになると思います。
また、真に何も入力しないためには、専用の入力をする必要があります。
(例えば Linux のような環境では Ctrl-D を押すなど)

投稿2022/02/04 12:38

yaito3014

総合スコア209

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

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

0

ベストアンサー

何も入力せずenterを押したところで

それは「何も入力していない」とは言いません。空行を入力しています。

fgetsNULLになるのは、ファイルが終了した場合(標準入力の場合、Ctrl+DやCtrl+Zで入力を終了した場合、あるいはリダイレクトしていて入力内容が尽きた場合)、あるいは読み込みエラーとなった場合です。

投稿2022/02/04 12:15

編集2022/02/04 12:16
maisumakun

総合スコア146544

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

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

退会済みユーザー

退会済みユーザー

2022/02/04 12:46

ありがとうございます! お恥ずかしながらCtrl+Dの存在を初めて知りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問