Rust中println!与print!函数输出顺序异常问题咨询
Rust代码输出顺序差异问题解析
问题描述
用户编写了两段仅输出提示方式不同的Rust代码,却出现了输出顺序差异的情况,疑问在于:为何第一段代码中please Enter your Guess :-在输入数字后才显示?
第一段代码
use std::io; fn main() { println!("Guess the Number!!!!!"); print!("please Enter your Guess :-"); let mut guess = String::new(); // taking input io::stdin() .read_line(&mut guess) .expect("failed to readline"); // parsing into Integer println!("you Guessed: {guess}"); }
(注:原代码缺少use std::io;,此处补充以保证代码可编译)
运行结果:
Guess the Number!!!!! 213 please Enter your Guess :-you Guessed: 213
第二段代码
use std::io; fn main() { println!("Guess the Number!!!!!"); println!("please Enter your Guess :-"); let mut guess = String::new(); // taking input io::stdin() .read_line(&mut guess) .expect("failed to readline"); // parsing into Integer println!("you Guessed: {guess}"); }
运行结果:
Guess the Number!!!!! please Enter your Guess :- 213 you Guessed: 213
原因解析
核心问题出在标准输出的缓冲机制上:
println!宏会在输出内容末尾自动添加换行符\n,同时触发标准输出的行刷新操作,输出内容会立即显示到终端。print!宏不会添加换行符,而终端默认采用行缓冲模式——只有当输出内容包含换行符、缓冲区被填满,或者程序主动触发刷新时,缓冲区里的内容才会被输出到终端。
第一段代码中,print!("please Enter your Guess :-")的内容没有换行符,因此被暂时存放在输出缓冲区中,没有立即显示。随后程序调用io::stdin().read_line()等待用户输入,此时终端优先处理用户的输入并显示输入内容;直到后续执行println!("you Guessed: {guess}")时,这个宏添加的换行符触发了行刷新,缓冲区里之前print!的内容才被一起输出,所以看起来提示语是在输入之后才出现的。
第二段代码使用println!输出提示语,自带的换行符直接触发了行刷新,提示语会立即显示在终端,之后再等待用户输入,输出顺序就符合预期了。
如果想让第一段代码的print!内容立即显示,可以手动触发缓冲区刷新,在print!之后添加以下代码:
std::io::stdout().flush().expect("Failed to flush stdout");
内容的提问来源于stack exchange,提问作者Nikhil kumar
相关产品推荐
相关产品推荐

