为什么从 stdin 读取用户输入时我的字符串不匹配?

Why does my string not match when reading user input from stdin?

提问人:Joe 提问时间:1/5/2015 最后编辑:ShepmasterJoe 更新时间:5/17/2022 访问量:3807

问:

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

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 条件语句 user-input

评论


答:

14赞 wingedsubmariner 1/5/2015 #1

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

评论

0赞 ArtemGr 1/5/2015
Windows 呢,应该是“\r\n”吗?
0赞 Joe 1/5/2015
它告诉我,当我添加 '&str 时,它没有为 '&str 类型实现 bool'
0赞 Joe 1/5/2015
在我查看文档后,我意识到它必须放在 if 语句中。谢谢!
2赞 reem 1/6/2015
您不需要 ,因为 implements . 应该工作。as_sliceStringDeref<Target=str>let line = io::stdin().read_line(); let trimmed = line.trim_right_chars(..);
3赞 Shepmaster 1/6/2015
我建议只使用 trimtrim_right,而不是试图担心跨平台换行符 :-)
23赞 Shepmaster 9/16/2016 #2

read_line在返回的字符串中包含终止换行符。 要删除它,请使用trim_end甚至更好的方法,只需修剪

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 应该无关紧要。


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

let trimmed_len = correct_name.trim_end().len();
correct_name.truncate(trimmed_len);
1赞 antoyo 11/16/2016 #3

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

还有一个特征:ChompInPlace,如果你更喜欢就地执行此操作。

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

评论

0赞 Shepmaster 11/16/2016
//有什么好处/区别?trimtrim_righttrim_right_matches
1赞 antoyo 11/16/2016
这是使用函数,因此 chomp 函数是快捷方式。还有一个特点是使用思想进行就地修剪。因此,好处主要是有一种更短的方法来修剪换行符。trim_right_matchestruncate