Rust中字符串比较始终返回false问题求助
问题原因
io::stdin().read_line(&mut userAttempt)会将用户输入的内容**连同末尾的换行符(\n)**一起存入字符串中。比如输入Miku后按回车,userAttempt实际是"Miku\n",而你定义的username是"Miku",两者自然不相等。
解决方案
处理输入字符串,去掉末尾的换行符或首尾空白字符,常用两种方式:
- 使用
trim():去掉字符串首尾的所有空白字符(包括换行、空格、制表符等),适合不需要保留首尾空格的场景。 - 使用
trim_end_matches('\n')或trim_end():只去掉末尾的换行符(trim_end()会去掉所有末尾空白),适合需要保留开头空格的场景。
修改后的代码
use std::io; fn main() { let username = "Miku"; let password = "password"; loop { let mut user_attempt = String::new(); let mut pass_attempt = String::new(); println!("Enter username:\n> "); io::stdin().read_line(&mut user_attempt).expect("Failed to read line"); // 去掉首尾空白,包括换行符 let user_attempt = user_attempt.trim(); println!("Enter password:\n> "); io::stdin().read_line(&mut pass_attempt).expect("Failed to read line"); let pass_attempt = pass_attempt.trim(); println!("{}", user_attempt == username); if user_attempt == username { println!("Got here!"); if pass_attempt == password { println!("Logged in successfully."); break; // 登录成功后退出循环,避免无限循环 } } } }
额外提示:你代码开头定义的let mut username = String::new();和let mut password = String::new();被后面的同名变量覆盖了,可直接删除以避免冗余。
内容的提问来源于stack exchange,提问作者Hatsune Miku
相关产品推荐
相关产品推荐

