PHPマニュアルで定義されているfscanfの戻り値
返り値
この関数のパラメータが二つだけの場合、処理された値は配列として返されます。 他方、オプションのパラメータが指定された場合、 この関数は、代入された値の数を返します。 オプション引数は参照渡しとする必要があります。
これを具体的に整理するのが本記事の目的。
この関数のパラメータが二つだけの場合
標準入力
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" |
array(null,null) |
0 |
|
48 HKT | "%d %d" |
array(48,null) |
1 |
|
HKT HKT | "%d %d" |
array(null,null) |
0 |
|
48 48 | "%d %d" |
array(48,48) |
2 |
|
(空行) | "%d %d" |
null |
-1 |
HKT 48
と48 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"));
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));
int(0)
int(1)
int(0)
int(2)
int(-1)
次回予告
これ、調べているうちに気持ち悪い動きがあったので、近日中に報告します。。。。