Rust程序中视觉一致的字符串if判断不匹配问题求助
问题原因
问题出在用户输入的字符串包含换行符,而文件中读取的行自动去掉了换行符:
read_line函数会把用户输入时按下的回车(\n,Windows系统是\r\n)一并读入返回的字符串中BufReader::lines()迭代器会自动移除每行末尾的换行符(包括\n和\r\n)
这就导致两个字符串看起来完全一样,但实际内容不同(一个带换行符,一个不带),所以直接相等比较会失败。
解决方案
只需要去掉用户输入字符串末尾的换行符即可,有两种修改方式:
方式1:修改get_user_input函数
在返回前处理输入字符串,去掉末尾的换行符:
use std::io; pub fn get_user_input(prompt: &str) -> String { println!("{}", prompt); let mut user_input: String = String::new(); io::stdin().read_line(&mut user_input).expect("Failed to read line"); // 移除末尾的所有换行/回车符 user_input.trim_end().to_string() }
方式2:在main函数中处理输入
如果不想修改输入函数,可以在获取用户输入后直接处理:
fn main() -> io::Result<()> { let mut user_password: String = user_input::get_user_input("Enter password:"); // 去掉末尾换行符 user_password.truncate(user_password.trim_end().len()); let file: File = File::open("passwords.txt")?; let reader: BufReader<File> = BufReader::new(file); for line in reader.lines() { let line: String = line.unwrap(); if line == user_password { println!("Password file contains {}!", user_password); break; } } Ok(()) }
也可以用strip_suffix精准匹配换行符,比如:
user_password = user_password.strip_suffix("\r\n") .or_else(|| user_password.strip_suffix("\n")) .unwrap_or(&user_password) .to_string();
验证方法
可以通过打印字符串的字节来确认差异:
println!("Line bytes: {:?}", line.as_bytes()); println!("Input bytes: {:?}", user_password.as_bytes());
这样就能看到输入的字符串末尾多了10(\n)或者13, 10(\r\n)的字节码。
内容的提问来源于stack exchange,提问作者figgyfarts
相关产品推荐
相关产品推荐

