LoginSignup
5
3

More than 3 years have passed since last update.

色んな言語で標準入力の値を取得する

Last updated at Posted at 2020-06-04

thx @sdkei @htsign

なぜやるのか

こういう系の記事はさぞQiitaに溢れているんだろうなと思ったら全然なかったので、備忘録としても役に立つので書いておきます。

GitHubのリポジトリはこちら

基準となるInput

予測不能な複数行の入力を取得し、一行ずつ配列に格納するコードのテンプレートを様々な言語で書いています。

例えば

Hello
World

かもしれないし、

How
are
you?

かもしれないというような、何行入力があるかわからないけど全行とりあえず配列に格納したい!という時に便利です。
ちなみに各コードの出力は基本的には

["Hello","World"]

の形で出力されるように書いていますがいくつかの言語はそうならない場合があります。ただどの言語でもarray[0]もしくはarray(0)を指定すれば"Hello"が返ってくるようにはなっているのでご安心ください。

本題

JavaScript

function Main(input) {
  let lines = input.split("\n");
  lines.pop();
  console.log(lines);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
//=>[ 'Hello', 'World' ]

Python3

import sys

lines = [line.rstrip() for line in sys.stdin]
print(lines)
#=> ['Hello', 'World']

Ruby

lines = ARGF.map &:chomp
p lines
#=> ["Hello", "World"]

PHP

<?php
while ($line = fgets(STDIN)) {
  $lines[] = trim($line);
}
foreach($lines as $array){
  echo "$array\n";
}
?>
#=> Hello
#=> World

Swift

let lines = Array(AnyIterator { readLine() })
print(lines)
#=> ["Hello", "World"]

Java

import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class StdIn {
    public static void main(String[] args) {
        try (var scanner = new Scanner(System.in)) {
            List<String> lines = Stream.generate(() -> scanner)
                .takeWhile(Scanner::hasNextLine)
                .map(Scanner::nextLine)
                .collect(Collectors.toList());
            System.out.println(lines);
        }
    }
}ello, World]

C#

using System;
using System.Collections.Generic;
public class Hello
{
  public static void Main()
  {
    string line;
    var array = new List<string>();
    while ((line = Console.ReadLine()) != null)
    {
      array.Add(line);
    }
    Console.WriteLine(array);
  }
}
//=> System.Collections.Generic.List`1[System.String]

Kotlin

fun main() {
    val lines = generateSequence { readLine() }.toList()
    println(lines)
}
//=> [Hello, World]

Scala

object Main extends App {
  val lines = io.Source.stdin.getLines().toSeq
  println(lines)
}
//=> ListBuffer(Hello, World)

Perl

my @lines = map { chomp $_; $_ } <>;
print join ',', @lines;
#=> Hello,World

Go

package main
import (
  "fmt"
    "os"
    "bufio"
    "strings"
)
func main() {
    array := []string{}
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {
                array = append(array, s.Text())
    }
    fmt.Printf("%s\n",strings.Join(array,","))
}
//=> Hello,World

C++

#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
  string str;
  vector<string> array;
  while (std::cin)
  {
    getline(cin, str);
    array.push_back(str);
  }
  for (auto lines : array)
  {
    cout << lines << endl;
  }
  return 0;
}
#=> Hello
#=> World
#=> (空白)

おわりに

後からコメントをいただいてmap系のイテレートは有能だということがわかりました。筆者はJavaScript以外ほとんど触ったことがないので冗長なコードがあればどしどしコメントを送ってください。

5
3
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3