提问人:Joe 提问时间:1/5/2015 最后编辑:ShepmasterJoe 更新时间:5/17/2022 访问量:3807
为什么从 stdin 读取用户输入时我的字符串不匹配?
Why does my string not match when reading user input from stdin?
问:
我正在尝试获取用户输入并检查用户是否输入“y”或“n”。令人惊讶的是,在下面的代码中,和 case 都没有执行!显然,既不是“y”也不是“n”。这怎么可能?我的字符串转换是不是错了还是什么?if
if else
correct_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!");
}
}
答:
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_slice
String
Deref<Target=str>
let line = io::stdin().read_line(); let trimmed = line.trim_right_chars(..);
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 应该无关紧要。
您也可以使用修剪后的结果的长度来截断原始结果,但在这种情况下,您应该只使用 !String
trim_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
//有什么好处/区别?trim
trim_right
trim_right_matches
1赞
antoyo
11/16/2016
这是使用函数,因此 chomp 函数是快捷方式。还有一个特点是使用思想进行就地修剪。因此,好处主要是有一种更短的方法来修剪换行符。trim_right_matches
truncate
评论