0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rust printしたい内容が順番通りに表示されない

Last updated at Posted at 2025-02-09

こうゆうプログラムを実行してみたんすよ

use std::io;

fn main() {
    let subjects: [&str; 3] = ["国語", "社会", "理科"];
    let mut scores: [i32; 3] = [0; 3];

    for (i, subjects) in subjects.iter().enumerate() {
        print!("{}の点数=", subjects);
        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        scores[i] = input.trim().parse::<i32>().expect("TypeError");
    }

    let sum: i32 = scores.iter().sum();
    let averave = sum as f64 / 3 as f64;

    println!("合計点は{}点です。\n平均点は{}点です。", sum, averave);
}

そしたら、print!("{}の点数=", subjects);の内容が表示されない!!!

なんでやねん

出力は以下のようになりました。

90
50
60
国語の点数=社会の点数=理科の点数=合計点は200点です。
平均点は66.66666666666667点です。

println!を使うと問題なくできるけど、print!を使うとできない!
でも、国語の点数=2みたいに、「=」のすぐ右に入力できるようにしたい

ちなみに全く同じ内容の記事も見つけました


となりましたので調べました(ChatGPT)

どうやらバッファリングというものが関係しているらしい

gpt answer

Rust の print! マクロは 標準出力 (stdout) をバッファリング します。
つまり、出力をある程度まとめてから表示 する仕組みになっています。

バッファリングとは?

  • print! の出力はすぐに画面に表示されず、一時的にメモリ上のバッファ (buffer) に溜められる。
  • バッファがいっぱいになるか、改行 (\n) が含まれると、そのタイミングで出力が画面に表示される。
  • これは効率的な入出力を行うための最適化です。もし1文字ごとに画面へ出力すると、処理速度が低下する可能性があるため、ある程度まとめて処理される仕組みになっています。

flushをつかえばいいのねー
なるほどねー

これらをを踏まえて、
以下のように変更したら、問題なく動作するようになりました。
Rustむずかしー!

//use std::io;
use std::io::{self, Write};

fn main() {
    let subjects: [&str; 3] = ["国語", "社会", "理科"];
    let mut scores: [i32; 3] = [0; 3];

    for (i, subjects) in subjects.iter().enumerate() {
        print!("{}の点数=", subjects);
        io::stdout().flush().unwrap(); // ここでフラッシュ
        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        scores[i] = input.trim().parse::<i32>().expect("TypeError");
    }

    let sum: i32 = scores.iter().sum();
    let averave = sum as f64 / 3 as f64;

    println!("合計点は{}点です。\n平均点は{}点です。", sum, averave);
}

出力

国語の点数=90
社会の点数=2
理科の点数=45
合計点は137点です。
平均点は45.666666666666664点です。
0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?