【Rust】標準入力(コンソールからの入力)と型変換

今回はRustで標準入力する方法について紹介します。

この記事でわかること
  • Rustでの標準入力方法
  • 標準入力した文字列のパース
目次

単純な実装

さっそく実装です。

標準入力は標準ライブラリstdにて実装されており特別なクレートは必要ありません。

単純に入力させる場合は以下のようにします。

use std::io::stdin;

fn main() {
    let mut buf = String::new();
    stdin().read_line(&mut buf).expect("error occurred.");

    println!("input={}", buf);
}
/bin/zsh % cargo run
... 中略
test
input=test

改行を取り除く

read_lineでは改行(Enter)までを入力として受け取ります。

そのため入力後の処理を進める中では改行が邪魔になることもあります。

改行を取り除きたい場合はtrim_endを使用します。

fn main() {
    let mut buf = String::new();
    stdin().read_line(&mut buf).expect("error occurred.");

    println!("input={}", buf.trim_end());
}

入力の前にメッセージを表示する

入力の前にメッセージを改行なしで表示させたい場合はprint!io::stdout().flush()を使用します。

use std::io;
use std::io::Write;

fn main() {
    print!("Please enter something: ");
    io::stdout().flush().unwrap();

    let mut buf = String::new();
    io::stdin().read_line(&mut buf).expect("error occurred.");

    println!("You entered '{}'", buf.trim_end());
}
/bin/zsh % cargo run
Please enter something: test
You entered 'test'

入力の前に改行なしで文字を表示したいけど上手く表示されないという方。

標準出力は基本的にバッファされるため「改行する」「フラッシュする」をしないと標準出力として表示されない場合があります。

println!は改行コードを付与するためあまり気にする必要がありませんが、print!には改行コードが付与されないため上記を意識する必要があります。

use std::io;

fn main() {
    print!("Please enter a number: ");
    // ここで改行もしくはフラッシュしていないので
    // 上記のメッセージがread_lineの前に表示されない

    let mut buf = String::new();
    io::stdin().read_line(&mut buf).expect("error occurred.");

    let number: i32 = buf.trim().parse().unwrap();
    println!("You entered '{}'", number);
}
/bin/zsh % cargo run
2
Please enter a number: You entered '2'

read_lineの前にprint!をしたのにメッセージが表示されないのは上記が原因なので注意です。

入力文字列を別のデータ型に変換する

入力した文字列を受け取った変数はもちろん文字列型です。

これを別のデータ型に変換する場合はparseを使用します。

fn main() {
    print!("Please enter a number: ");
    io::stdout().flush().unwrap();

    let mut buf = String::new();
    io::stdin().read_line(&mut buf).expect("error occurred.");

    // 左辺でデータ型を明示するやり方
    let number: i32 = buf.trim().parse().unwrap();
    println!("You entered '{}'", number);

    // 右辺でデータ型を明示するやり方
    let number = buf.trim().parse::<i32>().unwrap();
    println!("You entered '{}'", number);
}

parseを使用する場合は左辺か右辺で変換先のデータ型を明示する必要があります。

特に右辺で定義するやり方(::<データ型>の構文)はターボフィッシュと呼ばれています。

最後に

標準入力は簡単なものですが、意外とやり方を忘れていたり知らなかったりします。

ふとした時に使う場面があるのでうっすらと覚えておきたいです。

よかったらシェアしてね!
  • URLをコピーしました!
目次