Rust猜数字游戏注释掉println!语句后运行逻辑异常
问题原因
这是标准输出行缓冲机制导致的问题:
- Rust 中的
print!宏不会自动在输出末尾添加换行符,默认情况下终端的标准输出缓冲区只有遇到换行符、缓冲区被填满、或者程序主动刷新时,才会将缓冲区的内容输出到终端界面上。 - 原来保留
println!("In the loop");时,这句调用自动添加了换行符,会触发缓冲区刷新,你可以看到之前的大小提示内容;当你把这句注释掉之后,大小判断逻辑里的print!输出的内容一直留在缓冲区内没有被刷出,下一轮循环直接进入read_line等待用户输入,你看不到上一轮的猜大小提示,就会误以为程序没有正常运行。
解决方案
有两种常用修复方式:
方案1:将print!替换为println!
这是最简单的处理方式,println!自带的换行符会自动触发缓冲区刷新:
use rand::Rng; use std::io; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1..101); loop{ // println!("In the loop"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; if secret_number == guess { println!("Correct"); break; }else if secret_number > guess { println!("{} is smaller",guess); }else { println!("{} is bigger",guess); } } }
方案2:手动刷新标准输出缓冲区
如果你不想在提示末尾加换行,可以手动调用刷新方法,需要先导入std::io::Write trait:
use rand::Rng; use std::io; use std::io::Write; // 导入刷新需要的trait fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1..101); loop{ // println!("In the loop"); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; if secret_number == guess { println!("Correct"); break; }else if secret_number > guess { print!("{} is smaller",guess); }else { print!("{} is bigger",guess); } io::stdout().flush().expect("刷新输出失败"); // 手动刷新缓冲区 } }
内容的提问来源于stack exchange,提问作者gettinggud
相关产品推荐
相关产品推荐

