15

I want to compare a string input from stdin to a static string with no luck.

Here is what I have tried so far:

fn main() -> () {
    let mut line = "".to_string();
    let exit = "exit".to_string(); 

    while line.as_slice() != exit.as_slice() {
        let input = std::io::stdin().read_line().ok();

        line.push_str( input.unwrap().to_string().as_slice() );

        assert_eq!(line, exit);
    }   
}

However during assertion it failed. How should I compare a string input to a static string in Rust?

Your help is very much appreciated.

1 Answer 1

24

First of all, the line contains the line terminator. You probably want to use trim (or one of its variants) to ignore that.

Secondly, you're doing a lot of unnecessary conversions and allocations. Try to avoid those.

Third, to_string is (or at least, was the last time I checked) inefficient due to over-allocation. You want into_string.

Fourth, the quickest way to go from a String to a &str is to "cross-borrow" it; given a String s, &*s will re-borrow it as a &str. This is because a String implements Deref<&str>; in other words, String acts kind of like a smart pointer to a borrowed string, allowing it to decay into a simpler form.

Fifth, unless you're doing something unusual, you can rewrite this as a for loop using the lines iterator method.

Sixth, be aware that stdin() actually allocates a new buffered reader every time you call it. Not only that, but characters read into the buffer do not get "pushed back" into STDIN when a new buffer is created; that data is simply lost. So you really don't want to be calling it in a loop. If you need to, call it once and keep the result in a variable.

So, I end up with this:

fn main() {
    for line in std::io::stdin().lines() {
        // Extract the line, or handle the error.
        let line = match line {
            Ok(line) => line,
            Err(err) => panic!("failed to read line: {}", err)
        };

        assert_eq!(line.trim(), "exit");
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for that. I didn't realize that input string from STDIN contains newline.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.