【问题标题】:Why does my string not match when reading user input from stdin?为什么从标准输入读取用户输入时我的字符串不匹配?
【发布时间】:2015-03-02 14:58:24
【问题描述】:

我正在尝试获取用户输入并检查用户输入的是“y”还是“n”。令人惊讶的是,在下面的代码中,if 和 if else 都没有执行!显然,correct_name 既不是“y”也不是“n”。这个怎么可能?我做我的字符串转换错误还是什么?

use std::io;

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

【问题讨论】:

    标签: string rust conditional-statements user-input


    【解决方案1】:

    我建议不要使用trim_end_matches(以前称为trim_right_matches),而是使用trim_end(以前称为trim_right)或者更好,只是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!");
        }
    }
    

    最后一种情况处理许多类型的空白:

    返回一个删除了前导和尾随空格的字符串切片。

    “空白”是根据 Unicode 派生核心属性 White_Space 的条款定义的。

    Windows / Linux / macOS 无关紧要。


    您也可以使用修剪结果的长度来截断原始String,但在这种情况下您应该只使用trim_end!

    let trimmed_len = correct_name.trim_end().len();
    correct_name.truncate(trimmed_len);
    

    【讨论】:

      【解决方案2】:

      read_line 在返回的字符串中包含终止换行符。将.trim_right_matches("\r\n") 添加到correct_name 的定义中以删除终止的换行符。

      【讨论】:

      • Windows呢,应该是"\r\n"吧?
      • 当我添加该类型时,它告诉我 bool` 没有为类型 `&str 实现
      • 在查看文档后,我意识到它必须放在 if 语句中。谢谢!
      • 你不应该需要as_slice,因为String实现了Deref<Target=str>。 let line = io::stdin().read_line(); let trimmed = line.trim_right_chars(..); 应该可以工作。
      • 我建议只使用trim 或trim_right 而不是担心跨平台换行符:-)
      【解决方案3】:

      您可以使用chomp-nl crate,它提供了一个chomp function,它返回一个不带换行符的字符串切片。

      如果您更愿意就地执行此操作,还有一个 trait ChompInPlace。

      免责声明:我是这个库的作者。

      【讨论】:

      • 与trim / trim_right / trim_right_matches 有什么好处/区别?
      • 这是使用 trim_right_matches 函数,所以 chomp 函数是一个快捷方式。使用truncate 思想进行就地修剪还有一个特点。所以好处主要是有一个更短的方法来修剪换行符。
      猜你喜欢
      • 2019-05-04
      • 2011-04-16
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多