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

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

ただいまの
回答率

88.59%

一行に複数の標準入力値がある時

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,452

suzuki.natsumi

score 16

標準入力値
a b c
d
A B C

標準出力値
a+b+c
d*10
A*B*C

上記のような、一行に複数個ある標準入力値を取得して出力するスクリプトを書きたいです。
質問⓵
一行につき一つの入力値ならばできるのですが、一行に複数入力値があるときはどうやって取得したらよいのかわかりません。
どうすれば取得できるのでしょうか?
質問⓶
各入力値は、$array変数に配列としてなら代入できるのですが、配列ではなく一つの変数としてそれぞれの入力値を代入する方法を教えていただきたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

質問⓵
一行につき一つの入力値ならばできるのですが、一行に複数入力値があるときはどうやって取得したらよいのかわかりません。
どうすれば取得できるのでしょうか?

一行に複数ある、とのことですが、複数かどうかは標準入力で与えられた文字列の解釈なので、プログラム側で解読するしかないです。
下記にあげる例はスペースが区切り文字だとの解釈ですが、文字の位置で決まるならsubstringとかでも良いのかもしれません

質問⓶
各入力値は、$array変数に配列としてなら代入できるのですが、配列ではなく一つの変数としてそれぞれの入力値を代入する方法を教えていただきたいです。

下記にあげる例のように行の数だけ標準入力からうけとって、分ければ可能です。
ただ、同じことを何回もかくことになるので、そういうことをするよりも全部をいっきに取得して、配列をうまく操作したほうが効率的な場合が多いように思います。

質問者様の意図を解釈してコード化した例を記載します。

<?php
list($a, $b, $c) = explode(" ", trim(fgets(STDIN)));
$d = trim(fgets(STDIN));
list($A, $B, $C) = explode(" ", trim(fgets(STDIN)));
list($A1, $B1, $C1) = explode(" ", trim(fgets(STDIN))); //コメ

echo "{$a}+{$b}+{$c}\n";
echo "{$d}*10\n";
echo "{$A}*{$B}*{$C}\n";
echo "{$A1}*{$B1}*{$C1}\n"; //コメ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/30 14:49

    for文でループさせたらよいのかなと思ったのですが、うまく動作しませんでした。for文だとどのようなコードを書けばよいのでしょうか?

    キャンセル

  • 2018/10/30 14:57

    横から失礼いたします。
    入力行数を可変にしたいのであれば、最初に入力行数を入力させるような作りにするのはいかがでしょうか。

    例)4行入力したい場合
    4
    a b c
    d
    A B C
    A B C

    受け側はこのような感じに。

    $count = fgets(STDIN); //←入力行数
    $lines = [];

    for($i=0;$i<$count;$i++){
    $line = trim(fgets(STDIN)); //←入力行
    if(strlen($line) != 1)
    $line = explode(" ",$line);
    }
    $lines[] = $line;
    }

    キャンセル

  • 2018/10/30 15:10

    madoka9393様ありがとうございます。

    madoka9393様の案のようにforでやるには、事前に回数が分かっているか、回数をもらうかしないと動けません。
    while($line = trim(fgets(STDIN))){}で繰り返す方法もあります。
    いずれにしても、ラージA、ラージB、ラージCはどうやって受け取る予定なのですか?配列で良いことにするのですか?

    キャンセル

0

とりあえず取得部分だけ先行で(スペースで区切られていると仮定)

//入力値が「a b c」の場合
$str = fgets(STDIN);

$str = explode(" ",$str);
//$str=>Array
//(
//    [0] => a
//    [1] => b
//    [2] => c
//)

質問②の意図がイマイチ読み取れていないのですが、
例えば「変数1=a b c」「変数2=d」(略)のように受け取りたいということでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る