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

问题描述 投票:3回答:2

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");
}

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

Enter a string >> STDIN

实际输出是:

STDIN
Enter a string >> 

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

Enter a string >> 
STDIN

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

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

rust stdout stdin
2个回答
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");
}

1
投票

你应该能够在同一行写入输出并获得输入。

stdinstdout中没有“同一条线”的概念。只有不同的流,如果你想执行终端操作,你应该使用处理终端的东西,比如console

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

好吧,你走了:

use dialoguer::Input;

let name = Input::new().with_prompt("Your name").interact()?;
println!("Name: {}", name);
© www.soinside.com 2019 - 2024. All rights reserved.