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

时间:2016-09-11 18:59:34

标签: rust

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

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

cin >> n >> m;

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

2 个答案:

答案 0 :(得分: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.

请注意,如果输入无效,这将panic!;如果你想避免这种情况,你应该handle the result values properly

答案 1 :(得分:4)

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

以下示例代码使用scan-rules版本0.1.3(文件可以直接使用货物脚本运行)。

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

// 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),
    }
}

测试运行:

4  5
I read n=4, m=5

5 a
Failed to parse input: scan error: syntax error: expected integer, at offset: 2