{ }codelper

学习 › Java

基础 · 03

读取输入

从键盘(标准输入)读取文字和数字。

要解题就得读取输入(标准输入)。
下面的例子读入一行名字和一行数字,然后打招呼,并输出这个数的两倍。

import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        String name = sc.nextLine();        int n = Integer.parseInt(sc.nextLine().trim());        System.out.println("Hi, " + name + "!");        System.out.println(n * 2);    }}
stdin
Lara
3
stdout
Hi, Lara!
6

要点

  • 读到的东西永远是字符串。
    要当数字用,就得转换。
  • 输入可以一行一行地读,也可以按空白分隔,一块一块(单词或数字)地读。
  • 一行里有多个数时,先按空格拆开,再逐个转成数字。
  • 不知道有几行时,就一直读到输入结束。
    各语言表示“结束了”的方式不同。

各语言的写法

Python读一行用 input(),转数字用 int(...)。
一行多个数用 map(int, input().split())。
读到末尾用 for line in sys.stdin:
JavaScript最常见的做法是用 require("fs").readFileSync(0, "utf8") 一次读入全部,再用 split("\n") 分行。
转数字用 Number(...)。
按单词读时 .trim().split(/\s+/) 更安全
TypeScript和 JavaScript 一样
Java用 Scanner 的 nextLine() 读,用 Integer.parseInt(...) 转换。
也有只读一个数的 nextInt()。
读到末尾用 while (sc.hasNextInt())
C#用 Console.ReadLine() 读,用 int.Parse(...) 转换。
多个数用 Split(' ')。
读到末尾用 while ((line = Console.ReadLine()) != null)
C++std::cin >> n 会跳过空格和换行,读一块内容直接转成数字。
整行用 std::getline(std::cin, s)。
读到末尾用 while (std::cin >> x)
Cscanf("%d", &n) — 变量前一定要有 &。
%s 只读到空格前的一个单词,整行用 fgets。
读到末尾用 while (scanf("%d", &x) == 1)
Craykon读一行用 控制台.读行(),转数字用 .转数字()。
一行多个数用 控制台.读数字()(给出数字列表)。
读到 控制台.读行() 返回 空 为止

常见错误

读完数字马上读一行Java · C++

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

→ name 不是下一行,而是空字符串 "":它只读到了数字后面剩下的换行

像本例这样,从一开始就用 nextLine() 整行读取,再用 Integer.parseInt 转换。
C++ 中 cin >> n 之后的 getline 也一样。

把空行转成数字JavaScript · TypeScript

Number("")

→ 不报错,得到 0,读到空行的错误就被掩盖了

输入末尾的换行会让最后多出一个空字符串。
先 .trim() 再拆分。

各语言的差异
读到的值是字符串,不转换就计算会出错。
在 JavaScript 中给输入的 3 加 1,结果是 "3" + 1 → "31";Python 的 input() + 1 会报 TypeError。

练习题