Why does my string not match when reading user input from stdin?

前端 未结 3 1614
借酒劲吻你
借酒劲吻你 2020-11-22 12:34

I\'m trying to get user input and check if the user put in \"y\" or \"n\". Surprisingly, in the below code, neither the if nor the if else case exe

相关标签:
3条回答
  • 2020-11-22 13:00

    read_line includes the terminating newline in the returned string. Add .trim_right_matches("\r\n") to your definition of correct_name to remove the terminating newline.

    0 讨论(0)
  • 2020-11-22 13:03

    You can use the chomp-nl crate which provides a chomp function which returns a string slice without the newline characters.

    There is also a trait ChompInPlace if you prefer to do this in-place.

    Disclaimer: I am the author of this library.

    0 讨论(0)
  • 2020-11-22 13:09

    Instead of trim_right_matches, I'd recommend using trim_right or even better, just trim:

    use std::io;
    
    fn main() {
        let mut correct_name = String::new();
        io::stdin().read_line(&mut correct_name).expect("Failed to read line");
    
        let correct_name = correct_name.trim();
    
        if correct_name == "y" {
            println!("matched y!");
        } else if correct_name.trim() == "n" {
            println!("matched n!");
        }
    }
    

    This last case handles lots of types of whitespace:

    Returns a string slice with leading and trailing whitespace removed.

    'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

    So Windows / Linux / macOS shouldn't matter.


    You could also use the trimmed result's length to truncate the original String, but in this case you should only use trim_right!

    let trimmed_len = correct_name.trim_right().len();
    correct_name.truncate(trimmed_len);
    
    0 讨论(0)
提交回复
热议问题