如何从单行stdin中读取多个整数?

Jas*_*siu 1 rust

为了学习Rust,我正在研究HackerRank 30天挑战,Project Euler和其他编程竞赛.我的第一个障碍是从一行标准输入读取多个整数.

在C++中我可以方便地说:

cin >> n >> m;
Run Code Online (Sandbox Code Playgroud)

我如何在Rust中以惯用方式执行此操作?

Aur*_*001 7

据我所知,最好的方法是分割输入行,然后将它们映射到整数,如下所示:

use std::io;

let mut line = String::new();
io::stdin().read_line(&mut line).expect("Failed to read line");

let inputs: Vec<u32> = line.split(" ")
    .map(|x| x.parse().expect("Not an integer!"))
    .collect();

// inputs is a Vec<u32> of the inputs.
Run Code Online (Sandbox Code Playgroud)

请注意,panic!如果输入无效,则会出现这种情况; 如果你想避免这种情况,你应该正确处理结果值.

  • 对于那些复制此代码并出现恐慌“线程‘main’因‘不是整数!: ParseIntError { kind: InvalidDigit }’”而恐慌的人,用 split_whitespace 替换 split 可能会有所帮助。split 函数的结果中可能会出现“\n”。 (2认同)

blu*_*uss 5

您可以使用scan-rules crate ( docs ),它使这种扫描变得容易(并且具有使其功能强大的功能)。

下面的示例代码使用scan-rules版本 0.1.3(文件可以直接用 cargo-script 运行)。

示例程序在同一行接受两个由空格分隔的整数。

// cargo-deps: scan-rules="^0.1"

#[macro_use]
extern crate scan_rules;

fn main() {
    let result = try_readln! {
        (let n: u32, let m: u32) => (n, m)
    };
    match result {
        Ok((n, m)) => println!("I read n={}, m={}", n, m),
        Err(e) => println!("Failed to parse input: {}", e),
    }
}
Run Code Online (Sandbox Code Playgroud)

测试运行:

4  5
I read n=4, m=5

5 a
Failed to parse input: scan error: syntax error: expected integer, at offset: 2
Run Code Online (Sandbox Code Playgroud)