2016-09-11 18 views
0

Rustを学ぶために、私はHackerRank 30日間のチャレンジ、Project Euler、その他のプログラミングコンテストのようなものを見ています。私の最初の障害は、1つのstdin行から複数​​の整数を読み取ることです。stdinの1行から複数​​の整数を読み取るにはどうすればよいですか?

C++では私が便利と言うことができます:

cin >> n >> m; 

をどのように私はルーストに慣用的にこれを行うのですか?

+2

http://meta.stackoverflow.com/questions/261592/([あなたには、いくつかの努力をしてきました]ことを示すことが予想されますので、あなたの問題を解決する*前*の質問を解決するために、どのように多くの研究努力がスタックのオーバーフローの予想されますか?/ 261593#261593)現在のところ、あなたの質問は[このように]見えます(http://odesk.ro/wp-content/uploads/2013/10/Quotes31.jpg)。 – Shepmaster

+1

関連する:[関数スタイルを使用して浮動小数点のリストに文字列をパースするにはどうすればいいですか?](http://stackoverflow.com/questions/19507730/how-do-i-parse-a-string-to-a-list浮動小数点を使用する関数型) – Shepmaster

+2

関連:[失敗しても大丈夫なら、いくつかのintをstdinから読み込む最も簡単な方法は?](http://stackoverflow.com/q/35860264/155423) – Shepmaster

答えて

5

最良の方法は、私の知る限りでは、ちょうどこのような整数にそれらをマッピングし、入力ラインを分割することです:

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を指定する必要があります。

4

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 
関連する問題