Rustを学ぶために、私はHackerRank 30日間のチャレンジ、Project Euler、その他のプログラミングコンテストのようなものを見ています。私の最初の障害は、1つのstdin行から複数の整数を読み取ることです。stdinの1行から複数の整数を読み取るにはどうすればよいですか?
C++では私が便利と言うことができます:
cin >> n >> m;
をどのように私はルーストに慣用的にこれを行うのですか?
Rustを学ぶために、私はHackerRank 30日間のチャレンジ、Project Euler、その他のプログラミングコンテストのようなものを見ています。私の最初の障害は、1つのstdin行から複数の整数を読み取ることです。stdinの1行から複数の整数を読み取るにはどうすればよいですか?
C++では私が便利と言うことができます:
cin >> n >> m;
をどのように私はルーストに慣用的にこれを行うのですか?
最良の方法は、私の知る限りでは、ちょうどこのような整数にそれらをマッピングし、入力ラインを分割することです:
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を指定する必要があります。
scan-rulesクレート(docs)を使用すると、この種のスキャンが簡単になります(また、パワフルにする機能もあります)。
次のコード例は、scan-rules
バージョン0.1.3を使用しています(ファイルはcargo-scriptで直接実行できます)。
このプログラム例では、同じ行に空白で区切られた2つの整数を受け入れます。
// 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),
}
}
テストが実行されます:あなたはおそらくdownvotesを取得している
4 5
I read n=4, m=5
5 a
Failed to parse input: scan error: syntax error: expected integer, at offset: 2
http://meta.stackoverflow.com/questions/261592/([あなたには、いくつかの努力をしてきました]ことを示すことが予想されますので、あなたの問題を解決する*前*の質問を解決するために、どのように多くの研究努力がスタックのオーバーフローの予想されますか?/ 261593#261593)現在のところ、あなたの質問は[このように]見えます(http://odesk.ro/wp-content/uploads/2013/10/Quotes31.jpg)。 – Shepmaster
関連する:[関数スタイルを使用して浮動小数点のリストに文字列をパースするにはどうすればいいですか?](http://stackoverflow.com/questions/19507730/how-do-i-parse-a-string-to-a-list浮動小数点を使用する関数型) – Shepmaster
関連:[失敗しても大丈夫なら、いくつかのintをstdinから読み込む最も簡単な方法は?](http://stackoverflow.com/q/35860264/155423) – Shepmaster