如何覆盖循环内的可变字符串?

2023-11-30

我的示例稍作修改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"),
        }
    }
}

正如@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就胜利条件而言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何覆盖循环内的可变字符串? 的相关文章

随机推荐