言語別標準入出力

Latest Author harurunharurun /Date 2022-07-15 12:58:39 / Views 27670
3 (Favした一覧ページはユーザーページから)
各問題の入出力の受け取り方です。 ここでは、 No.9001 標準入出力の練習問題(テスト用)の問題を例にしております。

C++

#include <iostream>
#include <string>

using namespace std;

int main() {
    int a, b;
    string s;

    // 標準入力から、空白や改行で区切られた整数と文字列を読み込む。
    cin >> a >> b >> s;

    // 整数と文字列を空白で区切って、標準出力に書き出す。
    cout << a + b << " " << s << endl;
    return 0;
}
data9824さん提供

C

#include <stdio.h>  // scanfとprintfを使うおまじない

int main(int argc, char *argv[]){
    int A, B;
    char S[11];

    // 標準入力から読み込む(空白や改行で勝手に区切ってくれる)
    // 逆に空白込みの文字列を読み込む場合は別の方法で読む必要がある。
    scanf("%d%d%s", &A, &B, S);

    // 標準出力に出力
    printf("%d %s\n", A + B, S);

    return 0;
}
    
なおさん提供

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 標準入力から読み込む際に、Scannerオブジェクトを使う。
        Scanner sc = new Scanner(System.in);

        // int 1つ分を読み込む
        int a = sc.nextInt();

        // int 1つ分を読み込む
        int b = sc.nextInt();

        // String 1つ分を読み込む
        String s = sc.next();

        // 標準出力に書き出す。
        System.out.println((a + b) + " " + s);
    }
}
クラス名については https://yukicoder.me/help を参照。

C#

using System;
public class Program
{
    static void Main()
    {
        string s = Console.ReadLine();
        string[] t = s.Split(' ');
        int a = int.Parse(t[0]);
        int b = int.Parse(t[1]);
        s = Console.ReadLine();
        Console.WriteLine("{0} {1}", a + b, s);
    }
}
camypaperさん提供

D

import std.stdio, std.conv, std.string, std.range, std.array,
       std.algorithm;

void main() {
  auto I = readln().strip().split().map!(to!int)().array();
  auto S = readln().strip();

  writeln( I.sum, " ", S );
}
    
diginatuさん提供

Ruby

A,B=gets.split.map(&:to_i)
print A+B,' ',gets
cielさん提供

Python2 (PyPy2)

# -*- coding: utf-8 -*-
# ↑の一行をかかないと日本語のコメントが書けないので注意です。

# 標準入力から一行分を読み出し、文字列として格納する。
first = raw_input()

# 読み込んだ文字列をスペースで分割する。
split_first = first.split()

# それぞれをint型に変換する。
A = int(split_first[0])
B = int(split_first[1])

# 慣れてくると この一行でよい
# A, B = map(int, raw_input().split()) 

#2行目を読み込む
S = raw_input()

# 標準出力に書き出す。
# カンマで区切るとスペースで分割してくれるので楽です。
print A + B, S

Python3 (PyPy3)

# 標準入力から一行分を読み出し、文字列として格納する。
first = input()

# 読み込んだ文字列をスペースで分割する
split_first = first.split()

# それぞれをint型に変換する
A = int(split_first[0])
B = int(split_first[1])

# 慣れてくると この一行でよい
# A, B = map(int, input().split()) 

# 参考: リストを読む際はlist()で覆ってやらないといけない
# L = list(map(int, input().split()))

#2行目を読み込む
S = input()

# 標準出力に書き出す。
# カンマで区切るとスペースで分割してくれるので楽です。
print(A + B, S)
標準入力を一行分読み出し、文字列に格納する関数は、
Python2ではraw_input()、Python3ではinput()です。
Python2のinput()と同じ動きをする組込み関数はPython3には存在せず(※)、
Python3にはraw_input()という名前の組み込み関数は存在しません。
※eval(input())でエミュレートする案が有名か。
printもpython3からは関数呼び出しになっているので注意(注:Python2でもfrom __future__ import print_functionすることでこの挙動に出来ます)

PHP

<?php
    //一行分を読み込む, 空白で分割してそれぞれ$aと$bの変数に入れる
    list($a, $b) = explode(" ", trim(fgets(STDIN)));
    
    $c = $a + $b;
    //2行目を読み込む
    $S = trim(fgets(STDIN));
    //標準出力に書き出す。
    printf("$c $S\n");
最初に <?php をつけないといけないことに注意。最後の?>は必要ありません。

Perl

#!/usr/bin/perl

# 1行読み込む
$N = <>;
# 末尾に改行が付いているので取り除く
chomp $N;
# 空白で分割する
($A, $B) = split /\s/, $N;

# 1行読み込む
$S = <>;
# 末尾に改行が付いているので取り除く
chomp $S;

# 標準出力に出力します
print $A + $B, " ", $S;
なおさん提供

Perl 6

# 1行読み込んで空白で分割
my ($A,$B) = get().split(' ');

# 1行読み込む
my $S = get();

# 計算して出力
say $A+$B, ' ', $S;
なおさん提供

Scala

import scala.io.StdIn.readLine

object Main {
  def main(args: Array[String]){
    val ab = readLine().split(" ").map(_.toInt)
    val (a,b) = (ab(0),ab(1))
    val s = readLine()

    val n = a+b
    println(s"$n $s")
  }
}
    
ともきさん提供

JavaScript

nodeコマンドなどで端末でする場合は、入力が終わりというシグナルCtrl+Dを押す必要がある。
function Main(input) {
    // inputにはすべての入力の文字列が与えられるので必要に応じて input.split("\n") などで分割する。

    var data = input.split("\n")
    
    var first_line = data[0].split(" ")
    var second_line = data[1]
    
    var c = parseInt(first_line[0]) + parseInt(first_line[1])

    console.log(c + " " + second_line);
}

// Don't edit this line!
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
CodeforcesではNode.jsではなくv8が使用されている。両対応になる入出力例は以下のとおり(ただし空行を正しく処理できない点は注意を要する)。
var main=function(){
	var a=readline().split(' ').map(Number);
	print(a[0]+a[1]+' '+readline());
};

/// IO ///
if(typeof process!=='undefined'){
	//node.js
	var print=function(x){
		console.log(x);
	}
	var readline=(function(){
		var T=[],cnt=0;
		var stdin = process.openStdin();
		stdin.setEncoding('utf8');

		var input_fragment="";
		stdin.on('data', function(input) {
			var ref=(input_fragment+input).split("\n");
			input_fragment=ref.pop();
			for(var i=0;i<ref.length;i++){
				if(ref[i]=='')continue;
				T.push(ref[i]);
			}
		});
		stdin.on('end', function(z) {
			if(input_fragment){
				var ref=(input_fragment+"\n").split("\n");
				input_fragment=ref.pop();
				for(var i=0;i<ref.length;i++){
					if(ref[i]=='')continue;
					T.push(ref[i]);
				}
			}
			main();
		});

		return function(){
			if(T.length<=cnt)return null;
			return T[cnt++];
		};
	})();
}else{
	//v8
	main();
}
cielさん提供

Go

package main
import "fmt"

func main() {
	var A, B int
	var S string
	fmt.Scan(&A, &B, &S)
	fmt.Println(A+B, S)
}
fmhrさん提供

Haskell

-- <$>とか使う場合は必須。でも、7.10からはデフォルトで読み込まれるので不要。
import Control.Applicative

-- main、ここでIOモナドを完結させる。
main :: IO ()
-- do記法を使う。別に他の方法でもいいけど、読み込む物が多くなった場合は、
-- こっちの方がわかりやすいと思う。たぶん。
main = do
    -- ----
    -- 1行読み込んで、空白切りで配列に分割して、それぞれを数字に変換する。
    -- readで変換される型は、main'での型指定によって決まる。
    -- IO [a]
    ab <- map read . words <$> getLine
    -- ----
    -- 単純に1行をStringとして読み込む。末尾改行は含まれない。
    -- IO String
    s <- getLine
    -- ----
    -- その他に、1行に数字一つだけであれば下記のようにする。
    -- IO a
    -- n <- read <$> getLine
    -- ----
    -- 読み込んだ値を別関数に渡して、戻り値を出力する。
    -- 戻り値がIntの場合は、`print`を使う。
    -- 戻り値がFloatの場合は、`Text.Printf.printf`を使う必要がある。
    -- IO ()
    putStrLn $ main' ab s

-- 実際に問題を解く関数main'、実際の名前は何でもいい。
-- ここの型指定でmainでのreadが何に変換されるが決まる。
-- IOモナドは持ち込まずに純粋な関数だけの世界にすると書きやすいと思う。
main' :: [Int] -> String -> String
main' ab s = (show . sum) ab ++ " " ++ s
らっしー(raccy)さん提供

Nim

#!/usr/bin/env nim
import strutils
var AB=readLine(stdin).split()
var n=parseInt(AB[0])+parseInt(AB[1])
echo($n&" "&readLine(stdin))
cielさん提供

Rust

fn getline() -> String{
	let mut __ret=String::new();
	std::io::stdin().read_line(&mut __ret).ok();
	return __ret;
}

fn main(){
	let s=getline();
	let a:Vec<_>=s.trim().split(' ').collect();
	let x:i32=a[0].parse().unwrap();
	let y:i32=a[1].parse().unwrap();
	print!("{} ",x+y);
	println!("{}",getline());
}
cielさん提供

Kotlin

fun main(args: Array<String>){
	var (a,b)=readLine()!!.split(" ").map(String::toInt)
	print(a+b)
	print(" ")
	println(readLine())
}
cielさん提供

Scheme

#!/usr/bin/env gosh

; letは変数束縛の評価順が不定のためlet*を使う
(let* ((a (read)) (b (read)) (s (read)))
    (write (+ a b))
    (display " ")
    (write s)
    (newline)
)
cielさん提供

Crystal

#!/usr/bin/env crystal
s=gets
# sはnilである可能性があるので、ifで分岐させる
if s
	a,b=s.split.map{|e|e.to_i}
	print a+b
	puts " "+gets.not_nil! # not_nil!で外すことも可能
end
cielさん提供

ただし、64bit整数の入力にはto_i64を使いますが、以下のようなおまじないを挿入する必要があります。
lib C;fun strtoll(s: UInt8*,p: UInt8**,b: Int32): Int64;end
class String;def to_i64;C.strtoll(self,nil,10);end;end
本件は https://github.com/crystal-lang/crystal/issues/9654 にて議論されましたが解決は望めなくなりました。

OCaml

Scanf.sscanf (read_line ()) "%d %d" (fun a b ->
	print_int (a+b)
);;
print_string " "; print_string (read_line ()); print_newline ();;
cielさん提供
(*
 OCaml 4.12から 'String.split_on_char'という便利な関数が利用できるようになったので、
 例えば `read_line () |> String.split_on_char ' ' |> List.map int_of_string`
 といったような書き方が可能になった。

 (標準ライブラリではない `Str`を使ったりするような必要がなくなった)

 とはいえ、4.12に対応しているような"Online Judge"はまれ(AtCoderではなぜか使える)なのだが、
 この手の「新規で使えるようになった標準ライブラリの関数」といった類のものは、ほとんどOCamlで
 書かれている。

 例えば `String.split_on_char`ならば、次の行で定義されている。
 https://github.com/ocaml/ocaml/blob/cd65210491ae60803fa804e6e77fa8c2788da81e/stdlib/string.ml#L235

 なので、このコードをそのままコピーして動かすことは可能。
 この手段で `Aizu Online Judge`なんかのフ**キンなバージョンのOCamlでも気軽に書くことができる。
*)

let split_on_char sep s =
  let r = ref [] in
  let j = ref (String.length s) in
  for i = String.length s - 1 downto 0 do
    if String.unsafe_get s i = sep then begin
      r := String.sub s (i + 1) (!j - i - 1) :: !r;
      j := i
    end
  done;
  String.sub s 0 !j :: !r;;

(*
もちろん、スペース空けではない単体の要素は単純に `read_int ()`
してあげてもよい (内部的な挙動は `read_line () |> int_of_string `) *)

let () =
  read_int () |> solve;;

(*
Scanf.scanfを使う場合は、`Scanf.scanf " %d" (fun x -> x)`といったイディオムが使われることが多い。
*)

let scan_int () = Scanf.scanf " %d" (fun x -> x);;

eseharaさん提供

Fortran

implicit none
integer::a,b
character(99)::s
read(*,*) a,b,s
write(*,'(i0," ",a)') a+b,trim(s)
end
cielさん提供

F#

open System;
let a:String array=Console.ReadLine().Split(' ')
Console.Write(int(a.[0])+int(a.[1]))
Console.WriteLine(" "+Console.ReadLine())
cielさん提供

Kuin

func main()
    var a: int :: cui@inputInt()
    var b: int :: cui@inputInt()
    var s: []char :: cui@inputStr()
    do cui@print("\{a + b} \{s}\n")
end func

Whitespace