質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

2513閲覧

PHPの標準入力を汎用的に使えるコードを教えてほしい

Touhoku

総合スコア31

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2017/04/30 22:40

PHP

1<?php 2 $av = array(); 3 while(true) 4 { 5 //$a = trim(fgets(STDIN)); 6 $a=fgets(STDIN); 7 if ($a === FALSE ) 8 { 9 break; 10 } 11 $ta=explode(" ",$a); 12 foreach($ta as $v){ 13 $av[]=$v; 14 } 15 }

現在、このような汎用的なコードを使って標準入力をスペース区切り、改行区切りで取得するプログラムを使っているのですがどうにも読み込み終了時の改行が混じってキレイに処理できないのです。いくらでも例外を仕分けできますが、そうなるとコードが冗長になります。

こんな冗長な処理よりはC++のstd::cinのようなシンプルな方法が知りたいです。
cin >> a;
cin >> b;
とすればaとbに値を入れてくれるようなすごく便利な記法や手法?コードテンプレートはPHPにはないのでしょうか?
ご存じの方、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分で十分調べたという前提で書きます。
それでも見つからなかったとしたら、そのような方法は無いのでしょう。

恐らく競技プログラミングに使おうとされているのだと思いますが、自動採点であれば特に使えるライブラリも限られています。であれば、ごく一般的な手法でできるはずなので、存在するのなら簡単に見つかるのではないかと思われます。

では、欲しいコードが場合はどうするか?
再利用できるスニペットを自分で作ります。質問者さんの挙げられたコードでもいいのですが、二つ気になるところがあります。

一つは、行の分割とフィールドの分割が同時に行われていること。
もちろん、それで構わない時は構わないんです。しかし、これではいつでもそのままは再利用できません。
実際には、必ず全ての行をスペースで分割するとは限りません。
ですからここは、行の分割とフィールドの分割を別個の関数にしましょう。

もう一つは、行の分割が二回行われているところです。入力されるサイズは限られていると思うので、fgets ではなく、stream_get_line(STDIN, 0) を使って全ての行を一度に取得し、preg_split で分割してもいいのではないですか?

投稿2017/05/01 00:16

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Touhoku

2017/05/01 00:43

確かに仰せの通り、競技プログラミングです。十分調べたのですが、どうにもエレガントな記法が見つからなかったので質問致しました。 なるほど。行の分割とフィールドの分割を別個の関数でstream_get_lineという関数があったのですね盲点でした。確かに、教えていただいた方法のほうがわかりやすい記法になると感じました。 ご返信ありがとうございました。
guest

0

ひとまず、以下のような方法で対処しましたがやっぱり標準入力を受け取るだけでこの長ったらしい方法は冗長な気がします。エレガントな標準入力の受け取り方をご存じの方、どうかお知恵を拝借させてください。

PHP

1 $av = array(); 2 while(true) 3 { 4 $a=fgets(STDIN); 5 if ($a === FALSE ) 6 { 7 break; 8 } 9 $a=str_replace(array("\r","\n"),"",$a); 10 $ta=explode(" ",$a); 11 12 foreach($ta as $v){ 13 $av[]=$v; 14 } 15 }

投稿2017/04/30 22:49

Touhoku

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問