如何在Rust中读取stdin中的一行?

kognpnkq  于 2023-11-19  发布在  其他
关注(0)|答案(6)|浏览(129)

我要求的是C语言中fgets()的等价物。

let line = ...;
println!("You entered: {}", line);

字符串
我读过How to read user input in Rust?,但它询问如何读取多行;我只想要一行。
我也读How do I read a single String from standard input?,但我不确定它的行为是否像fgets()sscanf("%s",...)

wribegjk

wribegjk1#

How to read user input in Rust?中,您可以看到如何在所有行上进行重命名:

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

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

字符串
你也可以手动编译没有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();
}


你不能写一行代码来做你想做的事情,但是下面的代码只读一行(和How do I read a single String from standard input?中的答案完全一样):

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

fn main() {
    let stdin = io::stdin();
    let line1 = stdin.lock().lines().next().unwrap().unwrap();
}


您也可以使用text_io crate进行超级简单的输入:

#[macro_use] extern crate text_io;

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

o8x7eapl

o8x7eapl2#

如果你真的想要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)
}

字符串
不像C,你不会意外地溢出缓冲区;如果输入字符串太大,它会自动调整大小。
answer from @oli_obk - ker是你经常看到的惯用解决方案,它为你管理字符串,接口也干净得多。

4nkexdtk

4nkexdtk3#

stdin读取一行:

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

字符串
您可以使用line.trim_end()删除'\n'
读到下一页:

let mut buffer = String::new();
    std::io::stdin().read_to_string(&mut buffer)?;


使用隐式同步:

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

    println!("You entered: {}", line);
    Ok(())
}


使用显式同步:

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(())
}


如果你对字节数感兴趣,例如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(())
}


参见doc

qmelpv7a

qmelpv7a4#

从Rust 1.62开始,您可以使用Stdin::lines()来使用一行(代码)获取一行(输入):

fn main() {
    let line = std::io::stdin().lines().next().unwrap().unwrap();
}

字符串
虽然Stdin::lines()可以用于单行,但它通常用于获取多行。它简化了这种用例,因此不再需要担心生存期和锁定:

fn main() {
    for line in std::io::stdin().lines() {
        println!("line: {}", line.unwrap());
    }
}

b4qexyjb

b4qexyjb5#

  • 如果你想在某个时候离开 * for *-循环 *
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        match line {
            Err(_) => break,    // with ^Z
            Ok(s) => println!("{}", s),
        }

    }
    println!("fin");
}

字符串

3pvhb19x

3pvhb19x6#

你可以使用自己的macro。

macro_rules! read_line {
  () => {
    {
      let mut str = String::new();
      std::io::stdin().read_line(&mut str).expect("!");
      str
    }
  };
}

fn main () {
  println!("What is your name?");
  let name = read_line!();
  println!("Hello {}.", name.trim());
}

字符串

相关问题