要学习Rust,我正在研究HackerRank 30天挑战,Project Euler和其他编程竞赛。我的第一个障碍是从一行标准输入读取多个整数。
在C ++中,我可以方便地说:
cin >> n >> m;
如何在Rust中以惯用方式执行此操作?
答案 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