題名の通りです。
標準入力で与えられた文字が数字かどうかを確かめるのはどのようにしたらいいのでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
result: Result<_, _>
としたとき、result
がエラーかどうかはResult::is_ok
(リンク)で判定できます。 よってこのようにすれば良いです。 (「標準入力で受け取った値」というのがC++のiostream
やJavaのScanner
のようなものだと仮定しています。)
rust
1// [dependencies] 2// anyhow = "1.0.31" 3 4use anyhow::Context as _; 5use std::io::{self, Read as _}; 6 7// `main`の返り値には`()`のほか、`Result<(), impl Debug>`が使える。 8// `std::result::Result<(), Box<dyn std::error::Error>>`でも良い。 9fn main() -> anyhow::Result<()> { 10 let mut input = "".to_owned(); 11 12 // `<Stdin as Read>::read_to_string`でEOFまで一気に読む。 13 io::stdin().read_to_string(&mut input)?; 14 15 // あるいは一行だけ読むならこう (こちらは↑のと違い、実際に使うときにCtrl-Dが不要) 16 //io::stdin().read_line(&mut input)?; 17 18 // `str::split_whitespace`で`&str`を分割したイテレータを得る。 19 // https://doc.rust-lang.org/stable/std/primitive.str.html#method.split_whitespace 20 let mut input = input.split_whitespace(); 21 22 // `<Result<_, _> as Context>::with_context` 23 // https://docs.rs/anyhow/1.0.31/anyhow/trait.Context.html 24 let a = input.next().with_context(|| "No token")?; 25 dbg!(a.parse::<i64>().is_ok()); 26 27 let b = input.next().with_context(|| "No token")?; 28 dbg!(b.parse::<i64>().is_ok()); 29 30 // Rustでは多相なクロージャはまだ書けないが、マクロをつかうことで処理をまとめることができる。 31 //macro_rules! read(() => (input.next().with_context(|| "No token")?)); 32 //let (a, b) = (read!(), read!()); 33 //dbg!(a.parse::<i64>().is_ok()); 34 //dbg!(b.parse::<i64>().is_ok()); 35 36 Ok(()) 37}
「文字列が数字ならその数字に対してこうして、そうでければこうする(エラーにはしない)」としたいなら、このようにすれば良いです。
rust
1let mut input = input.split_whitespace(); 2 3match input.next().with_context(|| "No token")?.parse::<i64>() { 4 Ok(n) => { 5 let _: i64 = n; 6 todo!(); 7 } 8 Err(err) => { 9 eprintln!("error: {:?}", err); 10 todo!(); 11 } 12} 13 14// `Err`の場合でも中身の`err`が必要無ければこのように`if let`式で書ける 15//if let Ok(n) = input.next().with_context(|| "No token")?.parse::<i64>() { 16// let _: i64 = n; 17// todo!(); 18//} else { 19// eprintln!("error: {:?}", err); 20// todo!(); 21//}
書き捨てのコードなら?
や.with_context(..)
は.unwrap()
に置き換えても良いです。
投稿2020/06/27 16:53
総合スコア86
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/28 01:48