LoginSignup
1

More than 5 years have passed since last update.

【PHP】fscanfの戻り値【次回予告有】

Posted at

PHPマニュアルで定義されているfscanfの戻り値

PHP: fscanf - Manual

返り値
この関数のパラメータが二つだけの場合、処理された値は配列として返されます。 他方、オプションのパラメータが指定された場合、 この関数は、代入された値の数を返します。 オプション引数は参照渡しとする必要があります。

これを具体的に整理するのが本記事の目的。

この関数のパラメータが二つだけの場合

標準入力
1 2
ソース
<?php
var_dump(fscanf(STDIN,"%d %d"));
戻り値

処理された値は配列として返されます。

array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}

定義通りの結果になっています。

オプションのパラメータが指定された場合

標準入力
1 2
ソース
<?php
var_dump(fscanf(STDIN,"%d %d",$a,$b));
戻り値

代入された値の数を返します

int(2)

こちらも動作は定義通りです。

パターンマッチしないケースはどうなるの?

先に結論。

入力 パターン 正常性 オプ無 オプ有
HKT 48 "%d %d" :x: array(null,null) 0
48 HKT "%d %d" :x: array(48,null) 1
HKT HKT "%d %d" :x: array(null,null) 0
48 48 "%d %d" :o: array(48,48) 2
(空行) "%d %d" :x: null -1

HKT 4848 HKTの結果の違いが少し気持ち悪い気もしますが、1つめのパターンに脱落したら、以降のパターンは評価しないようです。

標準入力
HKT 48
48 HKT
HKT HKT
48 48

最後の1行は空行。4行目は正常ケースなのでそれ以外に注目。

オプションのパラメータが指定された場合

var_dump(fscanf(STDIN,"%d %d"));
var_dump(fscanf(STDIN,"%d %d"));
var_dump(fscanf(STDIN,"%d %d"));
var_dump(fscanf(STDIN,"%d %d"));
var_dump(fscanf(STDIN,"%d %d"));

 :arrow_down:

array(2) {
  [0]=>
  NULL
  [1]=>
  NULL
}
array(2) {
  [0]=>
  int(48)
  [1]=>
  NULL
}
array(2) {
  [0]=>
  NULL
  [1]=>
  NULL
}
array(2) {
  [0]=>
  int(48)
  [1]=>
  int(48)
}
NULL

オプションのパラメータが指定された場合

var_dump(fscanf(STDIN,"%d %d",$a,$b));
var_dump(fscanf(STDIN,"%d %d",$a,$b));
var_dump(fscanf(STDIN,"%d %d",$a,$b));
var_dump(fscanf(STDIN,"%d %d",$a,$b));
var_dump(fscanf(STDIN,"%d %d",$a,$b));

 :arrow_down:

int(0)
int(1)
int(0)
int(2)
int(-1)

次回予告

これ、調べているうちに気持ち悪い動きがあったので、近日中に報告します。。。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1