Why does my string not match when reading user input from stdin?
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.
read_line
includes the terminating newline in the returned string.
To remove it, use trim_end
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 == "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.
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_end
!
let trimmed_len = correct_name.trim_end().len();
correct_name.truncate(trimmed_len);
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.