如何在 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 中打印没有尾随换行符的输出?的主要内容,如果未能解决你的问题,请参考以下文章

jinja2如何删除尾随换行符

jinja2如何删除尾随换行符

PowerShell 管道添加换行符

如何阻止GCC从obj文件中的字符串文字中删除尾随换行符?

svn:修订文件缺少尾随换行符

JavaScript:有没有办法在没有换行符的情况下打印输出?