🐕

fgets(STDIN)ではtrimを意識して!!

2022/09/29に公開

この記事でわかること

  1. fgetsとSTDINについて
  2. fgetsする時の落とし穴[空行・改行まで読み込んでしまう]

1. fgetsとSTDINについて

paizaなどで見かけるfgets(STDIN)ですが、
これの処理方法で詰まることがあるので、一旦まとめておきます。

今回の記事は、
fgetsで1行取得するためにはtrimをつけようね!!って話です。

fgetsはファイルポインタから1行取得するための関数です。
ファイルシステム関数 > fgets

STDINは、なんやら難しそうなこと書いてあったが、要は読み取り専用のファイルってことでよさそう。
https://www.php.net/manual/ja/wrappers.php.php

で、まとめると、
読み取り専用のファイルを1行ずつ取得する!!
ってこと。


2. fgetsする時の落とし穴[空行・改行まで読み込んでしまう]

・・・
・・・
ふむふむ。。。
で、、、なにに困ったの?
fgets(STDIN)で読み取りファイルから1行を取得するってことでしょ?
簡単じゃん!!って思ったでしょ?
僕もそう思って、侮ってました。

これ、ちょっとした落とし穴があったりするんです。

fgetsで1行取得するでしょ?
ってことは、

ごんちゃん

こんなパターンも取得するし

      ごんちゃん      

こんなんも取得されちゃうんです。

そして、空行は空行のまま取得されちゃうのです。

なるほど、、、
言わんとしていることはわかるけど、実際なにに困るの?
って思う人もいると思います。
実例を出しますね!!

取得ファイルの1行目には"4 "が入っています。
4の後ろには半角空行と改行があります。

4 

これで取得して、文字数を確認してみましょう!

$number = fgets(STDIN);
var_dump($number);

すると

string(2) "4
"

おや、2文字になってますね。
取得したいのは4だけのはずなのに・・・
これは後ろの空行も取得しちゃってるってことなのです。
これを避けるためには、取得したい文字列の前後の余計な空行を削除できるtrim関数がオススメです!!

検証!!

$number = trim(fgets(STDIN));
var_dump($number);

すると

string(1) "4"

おお!!
ちゃんと1文字になってますね!
これで、文字列の比較もしやすくなりますね😄

最後に

小さいことに感じるかもしれませんが、
これをしなかった場合は
一桁の数字だけを取得したいとしても、
2文字として処理されているので拾えないパターンも出てくるので
気をつけてくださいね。
私は思い込みが強く、見つけるまでに苦労しました💦

Discussion