fgets(STDIN)ではtrimを意識して!!
この記事でわかること
- fgetsとSTDINについて
- fgetsする時の落とし穴[空行・改行まで読み込んでしまう]
1. fgetsとSTDINについて
paizaなどで見かけるfgets(STDIN)ですが、
これの処理方法で詰まることがあるので、一旦まとめておきます。
今回の記事は、
fgetsで1行取得するためにはtrimをつけようね!!って話です。
fgetsはファイルポインタから1行取得するための関数です。
ファイルシステム関数 > fgets
STDINは、なんやら難しそうなこと書いてあったが、要は読み取り専用のファイルってことでよさそう。
で、まとめると、
読み取り専用のファイルを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