質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

2876閲覧

rustで標準入力で受け取った値が数字か確かめたい

toriumi_haru

総合スコア26

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2020/06/27 14:15

編集2020/06/27 14:36

題名の通りです。

標準入力で与えられた文字が数字かどうかを確かめるのはどのようにしたらいいのでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

qryxip

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriumi_haru

2020/06/28 01:48

すごいです。 rustはもはやそんなことはできないのではないかとまで考えていました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問