Help us understand the problem. What is going on with this article?

PHPで標準入力から値を受け取る(競技プログラミングとか)

More than 3 years have passed since last update.

40歳にリーチがかかってるおっさんがどういうわけか競技プログラミングに目覚めた

業務ではマネジメント(それもインフラ系)をしているので、つい、カッとなって、先月あたりから、競技プログラミングに目覚めました。

1か月も経ってようやく標準入力から値を受け取ることにも慣れてきたので、いったん、整理。

パターン別:値の受け取り方

1行から1つの値を受け取る場合

Sample Input

3

Code

$a=intval(trim(fgets(STDIN)));
//do something...

1行から複数の値を受け取る場合

Sample Input

1 2 3

Code

fscanf(STDIN,"%d %d %d",$a,$b,$c);
//do something...

:arrow_down:別解

$input=explode(' ',trim(fgets(STDIN)));
$a=intval($input[0]);
$b=intval($input[1]);
$c=intval($input[2]);
//do something...

複数行から1行あたり複数の値を受け取る場合(行数あり)

Sample Input

3
1
2
3

Code

$n=intval(trim(fgets(STDIN)));
for($i=0;$i<$n;++$i){
    $a=intval(trim(fgets(STDIN)));
    //do something...
}

複数行から1行あたり複数の値を受け取る場合(行数あり)

Sample Input

3
1 2 3
4 5 6
7 8 9

Code

$n=trim(fgets(STDIN));
for($i=0;$i<$n;++$i){
    fscanf(STDIN,"%d %d %d",$a,$b,$c);
    //do something...
}

複数行から1行あたり1つの値を受け取る場合(行数なし)

Sample Input

1
2
3

Code

/* これだと0が入ってくるとループが止まってしまうのでNG
while($a=intval(trim(fgets(STDIN)))){
   //do something...
}
*/

//これなら大丈夫!
while(list($a)=fscanf(STDIN,"%d")){
    //do something...
}

/* これだと空行が混じると値を2回とってしまう
while(fscanf(STDIN,"%d",$a)){
    //do something...
}
*/

:arrow_down:別解

/* これだと空行が0になる
while(!feof(STDIN)){
   $a=intval(trim(fgets(STDIN)));
   //do something...
}
*/

//これなら大丈夫!
while(strlen($a = trim(fgets(STDIN)))>0){
    $a = intval($a);
    //do something...
}

複数行から1行あたり複数の値を受け取る場合(行数なし)

Sample Input

1 2 3
4 5 6
7 8 9

Code

/* 空行が混じると同じ値を二度繰り返すのでNG
while(fscanf(STDIN,"%d %d %d",$a,$b,$c)){
   //do something...
}
*/

//空行対策版
while(list($a,$b,$c)=fscanf(STDIN,"%d %d %d")){
   //do something...
}

:arrow_down:別解

/* 空行が混じると同じ値を二度繰り返すのでNG
while(!feof(STDIN)){
   fscanf(STDIN,"%d %d %d",$a,$b,$c);
   //do something...
}
*/

// これなら大丈夫(空行検出時はループしない)
while(strlen($input=trim(fgets(STDIN)))>0){
   sscanf($input,"%d %d %d",$a,$b,$c);
   //do something...
}

/* 空行は空行として扱いたい版
while(!feof(STDIN)){
   list($a,$b,$c)=fscanf(STDIN,"%d %d %d");
   //do something...
}
*/

dev100kg
正確には108kg/腰痛いおじさん/SIerでオウンドメディアを叫ぶ闇が深い課長さん
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした