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
相关产品推荐
相关产品推荐

