Search code examples
rust

How can I read a single line from stdin in Rust?


I'm asking for the equivalent of fgets() in C.

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

I've read How to read user input in Rust?, but it asks how to read multiple lines; I want only one line.

I also read How do I read a single String from standard input?, but I'm not sure if it behaves like fgets() or sscanf("%s",...).


Solution

  • In How to read user input in Rust? you can see how to iterate over all lines:

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

    You can also manually iterate without a for-loop:

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

    You cannot write a one-liner to do what you want. But the following reads a single line (and is exactly the same answer as in 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();
    }
    

    You can also use the text_io crate for super simple input:

    #[macro_use] extern crate text_io;
    
    fn main() {
        // reads until a \n is encountered
        let line: String = read!("{}\n");
    }