こうゆうプログラムを実行してみたんすよ
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点です。