You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:40:57