如何在 Rust 中打印没有尾随换行符的输出?
Posted
技术标签:
【中文标题】如何在 Rust 中打印没有尾随换行符的输出?【英文标题】:How do I print output without a trailing newline in Rust? 【发布时间】:2016-09-28 15:38:33 【问题描述】:Rust 中的宏 println!
总是在每个输出的末尾留下一个换行符。例如
println!("Enter the number : ");
io::stdin().read_line(&mut num);
给出输出
Enter the number :
56
我不希望用户的输入 56
换行。我该怎么做?
【问题讨论】:
【参考方案1】:这比乍一看要复杂。其他答案提到了 print!
宏,但这并不是那么简单。您可能需要刷新标准输出,因为它可能不会立即写入屏幕。 flush()
是 std::io::Write
的一部分,因此需要在其范围内才能工作(这是一个很容易出现的早期错误)。
use std::io;
use std::io::Write; // <--- bring flush() into scope
fn main()
println!("I'm picking a number between 1 and 100...");
print!("Enter a number: ");
io::stdout().flush().unwrap();
let mut val = String::new();
io::stdin().read_line(&mut val)
.expect("Error getting guess");
println!("You entered ", val);
【讨论】:
这是正确答案!非常感谢您的帮助!【参考方案2】:您可以改用print!
macro。
print!("Enter the number : ");
io::stdin().read_line(&mut num);
小心:
请注意,默认情况下 stdout 经常被行缓冲,因此可能需要使用
io::stdout().flush()
来确保立即发出输出。
【讨论】:
"请注意,默认情况下标准输出经常被行缓冲,因此可能需要使用io::stdout().flush()
来确保立即发出输出。" - doc.rust-lang.org/std/macro.print!.html
@ArtemGr:在 C++(我认为是 C)中,当您尝试从 stdin
读取数据时,stdout
缓冲区会立即被刷新。我本来预计(可能是错误的)Rust 会出现相同的行为,并且print!
页面上显示的示例不是从stdin
读取的,因此在这方面尚无定论......您有更多信息吗?
@MatthieuM。我每晚使用 Rust 在 Windows 和 Linux 上做了一个简单的测试,并且答案的代码中没有发生 no stdout flush,例如“输入数字:”仅在程序结束后打印,而不是在read_line
发生之前打印。
@ArtemGr:哎哟......这很混乱!可能有人认为它在某种程度上更好(显式优于隐式),但它确实有必要刷新!
@MatthieuM。是的,我喜欢标准输入和输出在 Rust 中不会相互影响。在输入上刷新输出对我来说听起来像是一个讨厌的副作用。以上是关于如何在 Rust 中打印没有尾随换行符的输出?的主要内容,如果未能解决你的问题,请参考以下文章