如果用户按enter键而不输入任何内容,我如何从控制台读取并避免崩溃?
let mut objectnumber = String::new();
println!("mennyi súlyt szeretnél megnézni? 3.=255 int");
if io::stdin().read_line(&mut objectnumber).is_ok() {
println!("{}csdcds", objectnumber);
}
//panic!("{}",objectnumber.len());
if objectnumber.len() < 3 {
let localrandnum: u8 = thread_rng().gen_range(0..=255);
println!("miután nem adtál meg semmit sem ezért {localrandnum}.at írtam be neked");
objectnumber = localrandnum.to_string();
}
let objectnumber: u8 = objectnumber.trim().parse::<u8>().expect("null");
这是工作,但我不认为它应该在Rust中这样做。我不知道为什么即使在空行上也可以,而解析却在谈论它是空的。
修复:
read_line
返回一个Result
,指示是否从stdin
读取错误。通常这只发生在非常特殊的情况下,所以现在让我们只unwrap
这个。objectnumber.len()
给出字符串的长度,而不是它的内容。为了检查< 3
的内容,我们需要先将其parse()
改为u8
。- 不要
expect
parse
,因为这依赖于用户输入。做一个正确的错误处理。这个点将告诉您数字是>255, <0还是其他数字。现在让我们默认为'0',因为它会被< 3
捕获。 - 不要将
thread_rng
生成的数字转换为String
;相反,把它直接objectnumber
。将它转换为字符串并返回是没有意义的。
use std::io;
use rand::{thread_rng, Rng};
fn main() {
let mut objectnumber = String::new();
println!("mennyi súlyt szeretnél megnézni? 3.=255 int");
io::stdin()
.read_line(&mut objectnumber)
.expect("Unable to read from stdin!");
// Convert from String to u8
let mut objectnumber: u8 = objectnumber.trim().parse::<u8>().unwrap_or(0);
if objectnumber < 3 {
objectnumber = thread_rng().gen_range(0..=255);
println!("miután nem adtál meg semmit sem ezért {objectnumber}.at írtam be neked");
}
println!("objectnumber: {}", objectnumber);
}
mennyi súlyt szeretnél megnézni? 3.=255 int
33
objectnumber: 33
mennyi súlyt szeretnél megnézni? 3.=255 int
1
miután nem adtál meg semmit sem ezért 191.at írtam be neked
objectnumber: 191