← Back to Home
【学習記録】標準入力の概念と主要言語での実装パターン

【学習記録】標準入力の概念と主要言語での実装パターン

標準入力多言語CLI

標準入力の基本的な概念から、PythonやJavaなど主要言語でのデータ受け取りパターン、高速化にデータを受け取る方法を記載します。

はじめに

この記事では、プログラムの基本である「標準入力」について学んだことをまとめています。

  • 学習の目的: 競技プログラミングやCLIツール開発において、様々な形式の入力をスムーズに扱えるようになるため。
  • この記事でわかること: 標準入力の仕組み、OSレベルでの振る舞い、そしてPythonを始めとする各言語での実践的なデータ受け取り方法。

標準入力のやりたいこととは

  • 標準入力とは、プログラムがキーボードやファイルなど外部からデータを受け取るための基本的な仕組みです。
  • Pythonで1行の文字列を受け取る最も基本的なコードは以下の通りです
# ユーザーが入力した文字列を1行受け取る
line = input()
print(f"入力された行: {line}")

標準入力とは?

標準入力(stdin)は、プログラムがデータを受け取るための入り口となる標準ストリームの一つです。UNIX系のOSでは、プロセスに対して以下の3つのストリームが自動的に用意されます。

  • 標準入力 (stdin): プログラムへのデータ入力(ファイルディスクリプタ: 0)
  • 標準出力 (stdout): プログラムの通常出力(ファイルディスクリプタ: 1)
  • 標準エラー出力 (stderr): エラーメッセージ用の出力(ファイルディスクリプタ: 2)

OS/シェルにおける振る舞い 標準入力は、主に以下の方法で利用されます。

  1. キーボードからの入力: ユーザーがターミナルで入力した内容がプログラムに渡されます。
  2. リダイレクト (<): ファイルの内容を、プログラムの標準入力に直接流し込みます。
./my_program < input.txt
  1. パイプ (|): あるコマンドの標準出力を、次のコマンドの標準入力に渡します。
cat data.txt | grep "keyword"

Pythonでの方法

Pythonでは主に input() と sys.stdin を使って標準入力を扱います。

基本的な受け取り

# 1行の文字列を受け取る
s = input()

# 1行の整数を受け取る
n = int(input())

リストでの受け取り

# スペース区切りの複数の文字列をリストに格納
str_list = input().split()
# 入力例: apple banana orange -> ['apple', 'banana', 'orange']

# スペース区切りの複数の数値をリストに格納
num_list = list(map(int, input().split()))
# 入力例: 1 2 3 -> [1, 2, 3]

# 1234 のような数値を桁ごとに分割してリストに格納
digit_list = list(map(int, input()))
# 入力例: 1234 -> [1, 2, 3, 4]

複数行の受け取り

# n行の文字列を受け取る
n = int(input())
lines = [input() for _ in range(n)]

# n行にわたるスペース区切りの数値を受け取る (2次元リスト)
n = int(input())
matrix = [list(map(int, input().split())) for _ in range(n)]
"""
入力例:
3
1 2
3 4
5 6
-> [[1, 2], [3, 4], [5, 6]]
"""

高速な入力処理 大量の入力を扱う際は sys.stdin.readline() が input() よりも高速です。

import sys
# input = sys.stdin.readline # このようにしておくと input() と同じように使える

# sys.stdin.readline() は末尾に改行文字(\n)を含むため、除去が必要な場合がある
line = sys.stdin.readline().strip()

ユースケースと注意点

  • 高速化: 大量のデータセットを扱う問題では、input() の代わりに sys.stdin.readline() を使うことがタイムアウト対策として有効です。
  • 改行コードの罠: sys.stdin.readline() は文字列の末尾に改行コード (\n) を含んだまま読み込みます。数値に変換する場合は問題ありませんが、文字列として扱う場合は .strip() や .rstrip() で除去する必要がないか常に意識することが重要です。
  • EOFまでの読み込み: sys.stdin.read() を使うと、入力の終わり(EOF)までを一つの文字列としてまとめて読み込むことができます。

まとめ

この記事では、標準入力の概念から、Pythonでの具体的なデータ受け取りパターンまでを整理しました。特に、スペース区切りの数値や複数行のデータを効率的にリストへ格納する方法は、多くの場面で役立つことが分かりました。 今後は、JavaやTypeScriptなど、他の言語での実装パターンも追記していく予定です。

参考資料

Other Learning Topics