
【学習記録】標準入力の概念と主要言語での実装パターン
標準入力多言語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/シェルにおける振る舞い 標準入力は、主に以下の方法で利用されます。
- キーボードからの入力: ユーザーがターミナルで入力した内容がプログラムに渡されます。
- リダイレクト (<): ファイルの内容を、プログラムの標準入力に直接流し込みます。
./my_program < input.txt
- パイプ (|): あるコマンドの標準出力を、次のコマンドの標準入力に渡します。
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など、他の言語での実装パターンも追記していく予定です。