如何在Rust中的同一行打印STDOUT并获取STDIN?

com*_*k64 3 stdin stdout rust

println!()print!()允许您打印分别串和变量,并没有尾随换行符.此外,该stdin()函数提供了从STDIN(stdin().read_line(&mut string))读取一行用户输入的功能.

它应该是安全的假设,如果print宏和read_line功能均连续使用,你应该能够编写输出和在同一行获取输入.但是,当发生这种情况时,将以相反的顺序执行段(首先读取STDIN,然后打印语句).

这是我想要完成的一个例子:

use std::io;

fn main() {
    let mut input = String::new();
    print!("Enter a string >> ");
    io::stdin().read_line(&mut input).expect("Error reading from STDIN");
}
Run Code Online (Sandbox Code Playgroud)

所需的输出将是(STDIN表示用户被要求输入的点,它实际上没有打印):

Enter a string >> STDIN
Run Code Online (Sandbox Code Playgroud)

实际输出是:

STDIN
Enter a string >> 
Run Code Online (Sandbox Code Playgroud)

另一方面,println宏不会颠倒顺序,尽管仍然存在尾随换行的问题:

Enter a string >> 
STDIN
Run Code Online (Sandbox Code Playgroud)

在Python(3.x的),这可以用一个单一的线来实现,这是因为input功能允许先于STDIN提示字符串参数:variable = input("Output string")

我在Rust文档中找不到类似于Python示例的解决方案后,将任务分离到print宏和read_line函数中.

bel*_*lst 9

stdout在换行符上刷新.由于您的print!语句不包含也不以换行结尾,因此不会刷新.你需要手动使用它std::io::stdout().flush()

例如

use std::io::{self, Write};

fn main() {
    let mut input = String::new();
    print!("Enter a string >> ");
    let _ = io::stdout().flush();
    io::stdin().read_line(&mut input).expect("Error reading from STDIN");
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信 Write 特性也需要在其工作范围内。`使用 std::io::Write; `(引用flush()方法) (3认同)