loops - loop{} 运行了两次?

标签 loops rust

我已经完整地编写了“The Rust Programming Language”在线书籍中的程序,chapter 2 .我还进一步开发了它:通过添加一个简单的问题/响应,用户可以通过输入“y”再次玩游戏。

但是,我的程序中遇到了一个小错误。当用户选择再次运行游戏时,文本输出“请输入(数字)猜测”重复两次。当然,这不会会影响程序的主要功能(重复后它仍然可以正常运行),但它看起来确实很奇怪,我宁愿现在就解决这个问题而不是离开它。

我已经进行了一些调试,这让我得出结论,它肯定发生在代码的 [图 3] 区域。要查看我是如何做到的,请转到下面的调试区域。

代码

extern crate rand;
#[macro_use]
extern crate text_io;

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

//Main code
fn main() {
    // Generate random number, create premise
    println!("Guess the number!");
    let mut breaking_choice = false;
    while !breaking_choice {
        let secret_number = rand::thread_rng().gen_range(1, 101);
        // **Problem area**
        loop {
            println!("Please input a (number) guess");
            println!("1"); // [**REFERENCE 1**]
            let mut guess = String::new();
            io::stdin()
                .read_line(&mut guess)
                .expect("Failed to read line");
            println!("2"); // [**REFERENCE 2**]
            let guess: u32 = match guess.trim().parse() { // [FIGURE 3]
                Ok(num) => num,                           // [FIGURE 3]
                Err(_) => continue,                       // [FIGURE 3]
            };

            // ...until correct
            match guess.cmp(&secret_number) {
                Ordering::Less => println!("Too small"),
                Ordering::Greater => println!("Too big"),
                Ordering::Equal => {
                    println!("Correct!");
                    break;
                }
            }
        }

        // **Possible problem area**
        println!("Would you like to continue playing? Y or N");
        let choice: String = read!();

        if choice == "N" {
            breaking_choice = true
        } else if choice == "n" {
            breaking_choice = true
        } else if choice == "Y" {
            continue;
        } else if choice == "y" {
            continue;
        }
    }
}

调试

我做的第一件事是在有问题的代码的主要处理区域放置一些简单的 println! 命令:[引用 1] 和 [引用 2]。这使我能够查看是否有任何命令是它们之间的问题,以便让我更好地了解正在发生的事情。我还将随机数生成器替换为一组数字 (let secret_number = 5;)

这是编译时发生的事情:

这是执行过程中发生的事情:

根据这些结果,我认为错误发生在 [图 3](主要输入验证)中,因为它似乎就此停止。

我将 println!("3"); 放在 //...until correct 之前,它不会在第一个循环中输出。因此,程序在 [图 3] 处出现问题。

最佳答案

我猜按 enter 会导致 CRLF (\r\n)(在 Windows 上;在 Linux 上它似乎工作正常),即两个空白字符。 read! 将只读取其中一个,下一个 read_line 调用将返回一个空行(仅包含 \n 的字符串( 0x0a)).

关于loops - loop{} 运行了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47227956/

相关文章:

rust - 使用列表项编辑列表

rust - 这些迭代向量的方法有什么不同吗?

rust - 我怎样才能简洁地组合许多不同类型的 `Result` ?

r - 简化 R 中的 while 循环

loops - 如何解决此错误?帕斯卡

c - 没有第二个条件的循环,即 bool 检查?

删除两个索引时的Java ConcurrentModificationException,当前索引和随机索引

loops - 在循环迭代器变量上使用 goroutines

rust - 在没有 std 的情况下将 *mut u8 转换为 &[u8]

rust - 切片的减法运算