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

How do I print STDOUT and get STDIN on the same line in Rust?

本问题已经有最佳答案,请猛点这里访问。

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

可以安全地假设,如果连续使用print宏和read_line函数,则应该能够在同一行上写入输出并获得输入。但是,发生这种情况时,将以相反的顺序执行段(首先读取STDIN,然后打印语句)。

这是我要完成的示例:

1
2
3
4
5
6
7
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");
}

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

1
Enter a string >> STDIN

实际输出为:

1
2
STDIN
Enter a string >>

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

1
2
Enter a string >>
STDIN

在Python(3.x)中,这可以用一行完成,因为input函数允许在STDIN提示符之前输入字符串参数:variable = input("Output string")

在Rust文档中找不到能够允许类似于Python示例的解决方案之后,我将任务分为了print宏和read_line函数。


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

例如

1
2
3
4
5
6
7
8
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");
}


you should be able to write output and get input on the same line.

stdinstdout中没有"同一行"的概念。 只是有不同的流,如果要执行终端操作,则应使用处理终端的内容,例如控制台。

In Python (3.x), this can be accomplished with a single line, because the input function allows for a string argument that precedes the STDIN prompt: variable = input("Output string")

好吧,这里您去:

1
2
3
4
use dialoguer::Input;

let name = Input::new().with_prompt("Your name").interact()?;
println!("Name: {}", name);

  • https://docs.rs/dialoguer/0.3.0/dialoguer/struct.Input.html#example-usage