LoginSignup
9
5

More than 3 years have passed since last update.

[Rust] println!とprint! 実行順序が逆になる → flushを使う

Last updated at Posted at 2020-03-03

課題

練習として以下のプログラムを作った。
文字列を入力して、挨拶文を出力するだけ。

use std::io::stdin;

fn main() {
    let mut name = String::new();
    println!("名前を入力してください> ");
    stdin().read_line(&mut name).unwrap();
    // read_lineは改行コード(\r\n)を含むので.trim()してから出力。
    println!("こんにちは、{}さん。", name.trim());
}
実行結果
名前を入力してください> 
beginner
こんにちは、beginnerさん。

「名前を入力してください> 」と名前の入力行が分かれている。
同じ行にそのまま入力できるほうが自然なので改良したいが、println! を print! に変えるだけではうまくいかなかった。
以下のように read_line と print! の処理順が逆になってしまう。

beginner
名前を入力してください> こんにちは、beginnerさん。

解決策

flush()を使えばよい。

use std::io::stdin;
use std::io::{stdout, Write};

fn main() {
    let mut name = String::new();
    print!("名前を入力してください> ");
    stdout().flush().unwrap();
    stdin().read_line(&mut name).unwrap();

    println!("こんにちは、{}さん。", name.trim());
}
実行結果
名前を入力してください> begginer
こんにちは、begginerさん。

参考

https://doc.rust-lang.org/std/io/struct.Stdin.html
https://doc.rust-lang.org/std/macro.print.html
実践Rust入門 6章

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5