{ }codelper

学ぶ › C

基礎 · 03

入力を受け取る

キーボード(標準入力)から文字と数を読みます。

問題を解くには入力(標準入力)を読む必要があります。
下の例は1行目の名前と2行目の数を読み、あいさつをしてその数の2倍を表示します。

#include <stdio.h> int main(void) {    char name[100];    int n;    scanf("%99s", name);    scanf("%d", &n);    printf("Hi, %s!\n", name);    printf("%d\n", n * 2);    return 0;}
stdin
Lara
3
stdout
Hi, Lara!
6

ポイント

  • 読んだものは常に文字列です。
    数として使うには変換します。
  • 入力は1行ずつ読むことも、空白で区切られたかたまり(単語や数)を一つずつ読むこともできます。
  • 1行に数が複数あるときは、空白で分けてから一つずつ数に変えます。
  • 何行あるかわからないときは、入力が終わるまで読みます。
    「終わった」の知らせ方は言語ごとに違います。

言語ごとの書き方

Python1行は input()、数へは int(...)。
1行の複数の数は map(int, input().split())。
最後までは for line in sys.stdin:
JavaScript全体を require("fs").readFileSync(0, "utf8") で一度に読み、split("\n") で行に分けるのがいちばん一般的です。
数へは Number(...)。
単語単位なら .trim().split(/\s+/) が安全です
TypeScriptJavaScript と同じです
JavaScanner の nextLine() で読み、Integer.parseInt(...) で変換します。
数を1つだけ読む nextInt() もあります。
最後までは while (sc.hasNextInt())
C#Console.ReadLine() で読み、int.Parse(...) で変換します。
複数の数は Split(' ')。
最後までは while ((line = Console.ReadLine()) != null)
C++std::cin >> n は空白や改行を飛ばして一かたまりをそのまま数として読みます。
1行全体は std::getline(std::cin, s)。
最後までは while (std::cin >> x)
Cscanf("%d", &n) — 変数の前の & は必須です。
%s は空白の手前までの1語しか読まないので、1行全体は fgets。
最後までは while (scanf("%d", &x) == 1)
Craykon1行は コンソール.行読み()、数へは .数に()。
1行の複数の数は コンソール.数読み()(数のリストで返します)。
最後までは コンソール.行読み() が なし を返すまで

よくある間違い

数を読んだ直後に行を読んだJava · C++

int n = sc.nextInt();
String name = sc.nextLine();

→ name は次の行ではなく空文字列 "" です。数のあとに残った改行だけを読んだからです

この例のように、最初から nextLine() で行ごと読み、Integer.parseInt で変換します。
C++ で cin >> n のあとの getline も同じです。

空行を数に変えたJavaScript · TypeScript

Number("")

→ エラーにならず 0 になるので、空行を読んだミスが隠れます

入力の最後の改行のせいで、末尾に空文字列がもう1つできます。
.trim() してから分けます。

言語ごとの違い
読んだ値は文字列なので、変換せずに計算するとおかしくなります。
JavaScript で入力 3 に 1 を足すと "3" + 1 → "31" になり、Python の input() + 1 は TypeError です。

練習問題