You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
}

另外你现有代码里可以简化的冗余逻辑:

  1. 拿到test_var之后不需要调用to_owned()再拷贝一次String,直接对test_var取切片即可,多余拷贝没有意义
  2. 最后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:02