Rust 在请求用户输入时,是否使用Interror?
我有一个rust代码,它在循环中请求用户输入Rust 在请求用户输入时,是否使用Interror?,rust,user-input,Rust,User Input,我有一个rust代码,它在循环中请求用户输入 use std::io; fn main() { let mut string = String::new(); loop { println!("Enter a value: "); let b = io::stdin().read_line(&mut string).expect("string"); let val: u32 =
use std::io;
fn main() {
let mut string = String::new();
loop {
println!("Enter a value: ");
let b = io::stdin().read_line(&mut string).expect("string");
let val: u32 = string.trim().parse().expect("Error");
println!("You typed: {:?}", val);
}
}
此代码在初始输入时工作,但在第二次出现恐慌并存在时输入值
线程'main'在'Error:parseInteror{kind:InvalidDigit}',src/main.rs:13:20处惊慌失措
注意:使用RUST\u BACKTRACE=1运行环境变量以显示回溯
如何解决此问题?您没有重置循环中的字符串,因此,如果第一次输入10,第二次输入5,您的字符串实际上是“10\n5”
,当然新行字符不是有效数字
编辑:要添加“如何解决此问题”-->请执行较小的步骤。如果解析失败,请打印出您试图解析的内容。根据std::io::stdin::read\u line
附加到缓冲区,因此对于第一次迭代string
包含例如100
,然后在第二次迭代中字符串将包含100\n100
,并且\n不能作为int进行解析
您可以通过每次迭代清除字符串或简单地
use std::io;
fn main() {
loop {
let mut string = String::new();
println!("Enter a value: ");
let b = io::stdin().read_line(&mut string).expect("string");
let val: u32 = string.trim().parse().expect("Error");
println!("You typed: {:?}", val);
}
}
这回答了你的问题吗?FWIW缓冲区在第一次迭代时可能是100\n
,因为read\u line
不会修剪尾随的换行符。OP在解析之前正确修剪。