🐙

PHP 標準入力 オーバーフローする時

2024/04/01に公開
<?php
$input_line = stream_get_line(STDIN, 0, PHP_EOL);

$s = preg_replace('/\B(?=(\d{3})+(?!\d))/', ',',$input_line);

echo $s;
    
?>

$var = fgets(STDIN);で整数型の標準入力を受け取った時、
入力値がPHPの扱える最大数値を超える場合は自動キャストでfloat型に変換される。
(PHPが扱える整数の最大値はvar_dump(PHP_INT_MAX)等で参照可能)

また、intval(int)で無理矢理整数型変換を行うとオーバーフローを起こす。

var_dump(PHP_INT_MAX);
//=>int(9223372036854775807)

//なお上記は64bitシステムの場合

PHP_INT_MAXを超える数字、例えば12345678901234567890を型変換されずに受け取りたい場合は
stream_get_line()を使用する。

stream_get_line($handle, $length, $ending)

— 指定されたデリミタの位置までのデータを一行分としてストリームから読み込む
(https://www.php.net/manual/ja/function.stream-get-line.php)
第一引数 ~ 第三引数まで記述必須
$handle = ファイルが保存されているパス
$length = 読み込まれるファイルの長さ
$ending = 区切り(デリミタ)の指定

stream_get_line()は取得するデータが数値であっても、明示的に数値として解釈せずデータをそのまま文字列として返す。
そのため自動キャストされずに済む。

fgets()では、逆に読み取ったデータが数値であるかどうかに関係なく文字列ではなく数値として解釈される。

stream_get_lineのページ 公式マニュアル
https://www.php.net/manual/ja/function.stream-get-line.php

Discussion