为啥从标准输入读取用户输入时我的字符串不匹配?
Posted
技术标签:
【中文标题】为啥从标准输入读取用户输入时我的字符串不匹配?【英文标题】: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!");
【问题讨论】:
【参考方案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
思想进行就地修剪还有一个特点。所以好处主要是有一个更短的方法来修剪换行符。以上是关于为啥从标准输入读取用户输入时我的字符串不匹配?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 C++ 中从标准输入读取行比 Python 慢得多?
为啥使用 getline 从标准输入获取大量输入会截断我的输入?