如何从控制台有效地读取一行用户输入? [重复]

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

我最近学习了如何使用Rust文档中的io读取输入,但是有没有“简单”的方法来读取控制台输入?我的根源是大量挖掘C ++,所以从控制台获取输入就像std::cin >> var一样简单。但在Rust,我正在做:

for line in io::stdin().lines() {
    print!("{}", line.unwrap());
    break;
}

这读取输入一次,但for循环似乎是一种非常笨拙的方法来实现这一点。我怎么能轻松做到这一点?

rust
3个回答
5
投票

qazxsw poi实际上是包裹qazxsw poi的qazxsw poi。正如你可以看到io::stdin()BufferedReader<>提供了很多提取内容的方法。

你特别注意:

stdin

它将尝试从标准输入读取一行(并可能返回错误)。从stdin读取in the docs的简单代码是:

BufferedReader

但它没有任何错误处理,很容易失败。

更明确的方法需要您更干净地处理事情:

fn read_line(&mut self) -> IoResult<String>

6
投票

int返回let a: int = from_str(io::stdin().read_line().unwrap().as_slice()).unwrap() ,而let a: int = match from_str( match io::stdin().read_line() { Ok(txt) => txt, // Return the slice from_str(...) expects Err(e) => { /* there was an I/O Error, details are in e */ } }.as_slice() ) /* match from_str(...) */ { Some(i) => i, // return the int to be stored in a None => { /* user input could not be parsed as an int */ } }; 实现std::io::stdin()特征。这意味着您可以在其上调用BufferedReader<StdReader>方法:

BufferedReader

如果你想读几行,最好先将Buffer结果保存到变量中。


3
投票

正如@freinn正确指出的那样,上面的答案现在已经过时了。从Rust 1.0开始,read_line()要求调用者传入缓冲区,而不是创建和返回一个缓冲区。以下代码需要Rust 1.26+(进一步简化错误处理)。

请注意,使用match io::stdin().read_line() { Ok(line) => // do whatever you want, line is String Err(e) => // handle error, e is IoError } 修剪响应。这样可以确保用户输入的换行符也不会成为响应的一部分,这会将问候语分成两行。另请注意,在用户未提供响应的情况下,下面的示例非常强大:

io::stdin()
© www.soinside.com 2019 - 2024. All rights reserved.