如何在Rust中打印输出时不带有尾随的换行符?

89
在Rust中,宏println!总是在每个输出末尾留下一个换行符。例如:
println!("Enter the number : ");
io::stdin().read_line(&mut num);

输出结果

Enter the number : 
56

我不希望用户输入的56出现在新的一行,我该怎么做?


这个回答解决了你的问题吗?为什么要在打印之前读取输入? - lmat - Reinstate Monica
4个回答

148

乍一看似乎比较简单,但实际比较棘手。其他答案提到了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
这是正确的答案!非常感谢您的帮助! - enbermudas
3
由于这是一个常见的“初级错误”,值得指出的是,在flush()之后添加unwrap()是为了隐式处理任何flush错误。也就是说,你也可以这样做:io::stdout().flush().expect("flush failed."); - robotshapes

64
您���以使用 print! 代替。
print!("Enter the number : ");
io::stdin().read_line(&mut num);

注意

请注意,默认情况下stdout经常是按行缓冲的,因此可能需要使用io::stdout().flush()确保立即输出内容。


32
请注意,默认情况下stdout经常是按行缓冲的,因此可能需要使用io :: stdout()。flush()来确保立即输出。 - ArtemGr
@MatthieuM。我在Windows和Linux上使用Rust nightly进行了简单的测试,答案的代码中没有stdout flush,例如,“输入数字:”只有在程序结束之后而不是在read_line之前才会打印出来。 - ArtemGr
@ArtemGr:哎呀...这很令人困惑!可以说这样做更好(显式优于隐式),但这使得刷新变得非常必要! - Matthieu M.
1
@MatthieuM。是的,我喜欢Rust中标准输入和输出不会相互影响。在输入时刷新输出听起来像是一个令人讨厌的副作用。 - ArtemGr
@MatthieuM. 或许在 print! 中添加一个 flush 是个好主意(https://github.com/rust-lang/rust/issues/23818)。如果能有一个刷新转义字符 ("foo\fbar\f") 就更棒了,但这只是我的幻想。 - ArtemGr
显示剩余2条评论

0

不要使用 print/ln! 宏。使用 write/ln! 宏。
这种方式比较冗长,但是在命令行应用程序中,print/ln! 对于可能被管道重定向到其他应用程序的输出来说是有问题的,而这在 Unix 环境中很常见。
始终使用相同的(只有在首次请求时才有"缓冲区")stdout 设备,但是系统的 stdout 设备会在进行管道/重定向时发生变化。因此,对于每个输出到 stdout 的内容,您都需要请求当前的 stdout 设备 (std::io::stdout())。这可以通过 write/ln! 宏来实现。
所以,可以说 print/ln! 是有问题的,而且存在了多年的一个未解决问题。


0
“‘56’显示在下一行,因为read_line函数还读取了用户在键入输入后输入的换行符\n。然后println!宏在输出末尾添加另一个换行符,这导致该值显示在新行上。
要在同一行上显示“56”,可以使用trim()方法从输入的末尾删除换行符,然后再打印。
输入= input.trim().to_string();”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接