如何从标准输入读取一行?

sas*_*alm 24 rust

我要求相当于fgets()C.

let line = ...;
println!("You entered: {}", line);
Run Code Online (Sandbox Code Playgroud)

我已经阅读了如何在Rust中读取用户输入?,但它询问如何读取多行; 我只想要一条线.

我也读过如何从标准输入中读取单个字符串?,但我不确定它是否表现得像fgets()sscanf("%s",...).

oli*_*obk 34

如何读取Rust中的用户输入?你可以看到如何迭代所有行:

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

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        println!("{}", line.unwrap());
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以在没有for循环的情况下手动迭代:

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

fn main() {
    let stdin = io::stdin();
    let mut iterator = stdin.lock().lines();
    let line1 = iterator.next().unwrap().unwrap();
    let line2 = iterator.next().unwrap().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

你不能写一个单行来做你想要的.但是以下内容读取了一行(并且与我如何从标准输入中读取单个字符串的答案完全相同):

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

fn main() {
    let stdin = io::stdin();
    let line1 = stdin.lock().lines().next().unwrap().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用text_iocrate进行超级简单输入:

#[macro_use] extern crate text_io;

fn main() {
    // reads until a \n is encountered
    let line: String = read!("{}\n");
}
Run Code Online (Sandbox Code Playgroud)

  • 那么[Stdin :: read_line](http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html#method.read_line)呢? (5认同)

was*_*mup 10

从中读取一行stdin

    let mut line = String::new();
    std::io::stdin().read_line(&mut line)?; // including '\n'
Run Code Online (Sandbox Code Playgroud)

您可以'\n'使用删除line.trim_end()

读到 EOF:

    let mut buffer = String::new();
    std::io::stdin().read_to_string(&mut buffer)?;
Run Code Online (Sandbox Code Playgroud)

使用隐式同步:

use std::io;
fn main() -> io::Result<()> {
    let mut line = String::new();
    io::stdin().read_line(&mut line)?;

    println!("You entered: {}", line);
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

使用显式同步:

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

fn main() -> io::Result<()> {
    let stdin = io::stdin();
    let mut handle = stdin.lock();

    let mut line = String::new();
    handle.read_line(&mut line)?;

    println!("You entered: {}", line);
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

如果您对字节数感兴趣,例如n,请使用:
let n = handle.read_line(&mut line)?;

let n = io::stdin().read_line(&mut line)?;

尝试这个:

use std::io;
fn main() -> io::Result<()> {
    let mut line = String::new();
    let n = io::stdin().read_line(&mut line)?;

    println!("{} bytes read", n);
    println!("You entered: {}", line);
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

文档


She*_*ter 9

如果你真的想要等效fgets,那么@Gerstmann是对的,你应该使用Stdin::read_line.此方法接受一个缓冲区,您可以更好地控制该字符串以将其放入:

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

fn main() {
    let mut line = String::new();
    let stdin = io::stdin();
    stdin.lock().read_line(&mut line).unwrap();
    println!("{}", line)
}
Run Code Online (Sandbox Code Playgroud)

与C不同,您不会意外地超出缓冲区; 如果输入字符串太大,它将自动调整大小.

@oli_obk - ker答案是大多数时候你会看到的惯用解决方案.在其中,字符串是为您管理的,界面更清晰.