失败的代码
use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
println!("Guess the Number!");
let mut guess = String::new();
let secret_number = rand::thread_rng().gen_range(1..10);
loop {
println!("Please input the guess.");
io::stdin().read_line(&mut guess).expect("Failed to read line");
let guess: u32 = guess.trim().parse().expect("Please Type a Number");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too Small!"),
Ordering::Greater => println!("Too Large!"),
Ordering::Equal => println!("You got this"),
}
}
}
Run Code Online (Sandbox Code Playgroud)
有效的代码
use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
println!("Guess the Number!");
let secret_number = rand::thread_rng().gen_range(1..10);
loop {
println!("Please input the guess.");
//Now Defining guess Inside the loop
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("Failed to read line");
let guess: u32 = guess.trim().parse().expect("Please Type a Number");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too Small!"),
Ordering::Greater => println!("Too Large!"),
Ordering::Equal => println!("You got this"),
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,每次循环运行时定义猜测使我的代码正常工作,否则,我会收到如下所示的错误
为什么会发生这种情况,我只输入整数,这样我就不应该出现数据类型不匹配的情况,为什么一旦我开始定义猜测,它就会一次又一次地工作,我认为这与 rust 如何处理空格或输入中换行,但不确定。任何帮助将不胜 感激
它失败了,因为每次您read_line都会将标准输入缓冲区附加到guess字符串中。所以guess会改变如下。
1\n-> 1\n2\n->1\n2\n3\n
为了解决这个问题,每个循环中的clear变量guess。
use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
println!("Guess the Number!");
let mut guess = String::new();
let secret_number = rand::thread_rng().gen_range(1..10);
loop {
println!("Please input the guess.");
io::stdin().read_line(&mut guess).expect("Failed to read line");
// I renamed it to a different name. Because I want to access the guess string in the end of the loop
let guess_nmb: u32 = guess.trim().parse().expect("Please Type a Number");
println!("You guessed: {}", guess_nmb);
match guess_nmb.cmp(&secret_number) {
Ordering::Less => println!("Too Small!"),
Ordering::Greater => println!("Too Large!"),
Ordering::Equal => println!("You got this"),
}
// Clear the guess string
guess.clear();
}
}
Run Code Online (Sandbox Code Playgroud)