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

Rust循环获取有效输入宏失效,is_ok()始终返回false求助

Rust input宏parse始终返回false的问题解决

你的input宏存在一个关键问题:用于存储输入的字符串it在循环过程中没有被清空,每次调用read_line都会将新输入的内容追加到已有字符串的末尾。

举个例子:第一次输入非数字内容(比如abc),it会变成"abc\n";当你第二次输入有效数字123时,read_line会把"123\n"追加到it后面,此时it的内容是"abc\n123\n",调用trim()后得到"abc\n123",显然无法解析为i16类型,导致is_ok()永远返回false。

修复方案

方案1:每次循环清空字符串

在每次调用read_line前,调用it.clear()清空已有内容:

use std::io;

macro_rules! input {() => {{
        let mut it = String::new();
        loop {
            it.clear();
            io::stdin().read_line(&mut it).expect("Failed to read input");
            if it.trim().parse::<i16>().is_ok() {
                break;
            } else {
                println!("Error: 请输入有效的整数");
            }
        }
        it.trim().parse().expect("请输入正确的整数!")
}}}

fn main () {
    println!("请输入一个数字: ");
    let my_num: i16 = input!();
    println!("你输入的数字是 {}", my_num);
    println!("请输入另一个数字: ");
    let mut a: i16 = input!();
    println!("你输入的数字是 {}", a);
    a += my_num;
    println!("两个数字的和是 {}", a);
}

方案2:循环内创建新字符串(更简洁)

直接在循环内部创建新的字符串变量,避免内容累积,同时利用match直接处理解析结果,减少重复操作:

use std::io;

macro_rules! input {() => {{
        loop {
            let mut it = String::new();
            io::stdin().read_line(&mut it).expect("Failed to read input");
            match it.trim().parse::<i16>() {
                Ok(num) => break num,
                Err(_) => println!("Error: 请输入有效的整数"),
            }
        }
}}}

fn main () {
    println!("请输入一个数字: ");
    let my_num: i16 = input!();
    println!("你输入的数字是 {}", my_num);
    println!("请输入另一个数字: ");
    let mut a: i16 = input!();
    println!("你输入的数字是 {}", a);
    a += my_num;
    println!("两个数字的和是 {}", a);
}

内容的提问来源于stack exchange,提问作者AxelAGBL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:36:23