Rust中输入得到的&str数字未通过校验而硬编码同值&str可通过的原因?
问题根因
std::io::stdin().read_line()方法读取用户输入时,会将你输入结束按下的换行符也一并写入传入的String缓冲区中,所以你最终拿到的输入字符串末尾默认携带换行符(Linux/macOS下为\n,Windows下为\r\n)。这类换行符不属于数字字符,所以chars().all(char::is_numeric)校验自然返回false,而硬编码的字符串没有携带额外换行符,所以校验可以正常通过。
你可以加一行调试代码验证这个问题:
println!("输入字符串的字节序列:{:?}", test_var.as_bytes());
输入123的情况下,你会看到输出的字节数组末尾多了对应换行符的字节值。
修复方案
只需要在拿到输入字符串后,调用trim_end()方法去除末尾的空白类字符(包含换行符、回车符、制表符等)即可,也可以用trim()方法同时去除首尾的所有空白字符,根据你的业务需求选择即可。
示例修改(直接修改get_input函数即可):
fn get_input() -> String{ println!("Please enter the grid size" ); let mut input_string = String::new(); std::io::stdin().read_line(&mut input_string).expect("Failed"); // 去除末尾的换行等空白字符 input_string.trim_end().to_string() }
另外你现有代码里可以简化的冗余逻辑:
- 拿到
test_var之后不需要调用to_owned()再拷贝一次String,直接对test_var取切片即可,多余拷贝没有意义 - 最后的
match test {true => return true,false => return false,}可以直接简化为return test;
Rust学习建议
- 先啃透核心特性:所有权、借用、生命周期是Rust区别于其他编程语言的核心设计,刚开始学习不用急于写复杂项目,先把这三个特性的规则、适用场景、常见报错场景搞清楚,后续写代码会少走很多弯路。
- 优先查标准库文档:Rust官方标准库文档的说明、示例非常完善,你用到的所有标准库方法的行为、注意事项都有明确说明,比如
read_line的文档里明确标注了会包含换行符,遇到拿不准的方法优先查文档说明。 - 重视编译器报错:Rust的编译器报错信息友好度非常高,大部分报错都会明确指出问题位置、错误原因,甚至直接给出修复建议,遇到编译错误不要急着搜答案,先仔细读完报错内容,大部分问题可以自己解决。
- 从小项目逐步练手:入门阶段可以从简单的命令行工具开始练手,比如计算器、Todo清单、文本统计工具等,逐步熟悉Rust语法和标准库使用,不要一上来就尝试高并发、底层开发类的复杂项目,容易打击学习积极性。
- 避免其他语言的思维惯性:不要直接套用Python、Java等语言的编程习惯写Rust,比如随意克隆对象、随处使用共享引用等,先遵循Rust的规则写代码,熟练之后再按需做优化调整。
内容的提问来源于stack exchange,提问作者iktefish
相关产品推荐
相关产品推荐

