web-dev-qa-db-ja.com

文字列スライスをintに変換するRust

この質問のコードは、1.0より前のバージョンのRustに関連していますが、回答はRust 1.0用に更新されています。

文字列を整数に変換するのに問題があります。

fn main() {
    let input_text = io::stdin()
        .read_line()
        .ok()
        .expect("failed to read line");

    let input: Option<int> = from_str(input_text.as_slice());

    println!("{}", input);
}

コンソールに数値(たとえば42)を入力すると、プログラムはNoneを出力します。

ドキュメントによると これは文字列の形式が正しくない場合の通常の状況ですが、私の42の何が問題になっていますか?

14
Glen Swift

str::parse() を呼び出すことができますが、_read_line_が機能していることを確認する必要があります。リーダーが必要です:

_use std::io;

fn main() {
    let reader = io::stdin();
}
_

stdin 入力ストリームを処理するグローバルバッファを読み取り、 BufRead トレイトを実装します _read_line_メソッド メソッド。これは、可変のStringを入力バッファーとして受け取り、改行バイトに到達するまでストリームからすべてのバイトを読み取り、それらをバッファーに追加します。 #expect() メソッドはResultをアンラップします。 Errの場合、メッセージと原因でパニックになります。

_use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();
    reader.read_line(&mut input_text).expect("failed to read line");
}
_

これで、_i32_に変換する入力テキストができました。これは、解析する型を指定する限り、str::parse()が機能する場所です。 str::trim() _read_line_にはバッファに改行バイトが含まれているため、必要です

_use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();
    reader.read_line(&mut input_text).expect("failed to read line");
    let input = input_text.trim().parse::<i32>();
}
_

まだ完了していませんが、パターンマッチングを使用して入力を正常に解析したことを確認する必要があります。元の入力バッファを使用可能な整数に変換するために必要なすべてのコードは次のとおりです。

_use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();

    reader.read_line(&mut input_text).expect("failed to read line");

    let input_opt = input_text.trim().parse::<i32>();

    let input_int = match input_opt {
        Ok(input_int) => input_int,
        Err(e) => {
            println!("please input a number ({})", e);
            return;
        }
    };

    println!("{}", input_int);
}
_

これはエラーや警告なしでコンパイルされます。

18
rouma7

_read_line_ のドキュメントで説明されているように、入力の最後に改行が含まれます。これにより、from_str()が失敗します。 std::str::trim()を使用してこれを変更する:

_let input: Result<i32, _> = input_text.parse();
_

これに:

_let input: Result<i32, _> = input_text.trim().parse();
_

うまくいくようです。

8
Ercan Erden

Rust 1.14、 Rustプログラミング言語この例

let guess: u32 = guess.trim().parse()
    .expect("Please type a number!");

同じ変数名を再度使用することもでき、新しいタイプは古いタイプを「シャドウ」します。

use std::io;

fn main() {
    let mut input_text = String::new();

    io::stdin()
        .read_line(&mut input_text)
        .expect("failed to read line");

    let input: u32 = input_text.trim().parse()
        .expect("Please type a number!");
}
4
Jeff Gran

これを試して:

fn main() {
    let input_text = std::old_io::stdin()
        .read_line()
        .ok()
        .expect("failed to read line");
    let input_number: Option<i32> = input_text.trim().parse().ok();
    let number = match input_number{
        Some(num) => num,
        None => {
            println!("Wrong input data! Input a number.");
            return;
        }
    };
    println!("{}", number);
}
3