0

我的示例根据 The Rust Book 中的猜谜游戏教程稍作修改。

在第一次迭代之后,循环似乎没有正确读取用户输入到可变字符串。

您能否确定以下代码中的问题mut input_text

extern crate rand;

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    let random_number = rand::thread_rng().gen_range(1, 51);
    let mut input_text = String::new(); // Works fine if allocated inside loop
    loop {
        println!("Enter your guess:");
        io::stdin()
            .read_line(&mut input_text)
            .expect("Failed to read input");

        let input_number: u32 = match input_text.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!(
            "You entered {} which converted to u32 is {}",
            input_text, input_number
        );

        match input_number.cmp(&random_number) {
            Ordering::Greater => println!("Input > Random"),
            Ordering::Less => println!("Input < Random"),
            Ordering::Equal => println!("Input == Random"),
        }
    }
}
4

1 回答 1

1

正如评论中提到的@Jmb,read_line不会覆盖字符串而是附加到它。如果您想覆盖字符串,您必须首先调用clear它,如下所示:

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    let random_number = rand::thread_rng().gen_range(1, 51);
    let mut input_text = String::new();
    loop {
        println!("Enter your guess:");

        // clear input_text from previous loop iteration
        input_text.clear();
        io::stdin()
            .read_line(&mut input_text)
            .expect("Failed to read input");

        let input_number: u32 = match input_text.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!(
            "You entered {} which converted to u32 is {}",
            input_text.trim(), input_number
        );

        match input_number.cmp(&random_number) {
            Ordering::Greater => println!("Input > Random"),
            Ordering::Less => println!("Input < Random"),
            Ordering::Equal => {
                println!("Input == Random");
                break; // break on win condition
            },
        }
    }
}

你的程序也是一个无限循环,所以我break在获胜条件上添加了一个。

于 2020-06-26T13:05:25.123 回答