循环{}运行两次?

时间:2017-11-10 17:12:17

标签: loops rust

我已经完成了对#34; The Rust Programming Language"在线预订,getaddrinfo()。我还开发了它比提供的更多:通过添加一个简单的问题/响应,用户可以通过输入" 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之前,而<nav class="navbar navbar-default navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data- toggle="collapse" data-target="#collapse"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <section class="layout"> <div class="branding"> <a href="/"><img src="images/header/app_fh_logo.png" alt="App logo"></a> </div><!--branding--> </section><!--layout--> </div><!--navbar-header--> </div> <div class="collapse navbar-collapse" id="collapse"> <ul class="nav navbar-nav navbar-right"> <li alt="standard"><a href="/"><span class="glyphicon glyphicon- home"></span>Startseite</a> </li> <li class="dropdown"> <a class="dropdown-toggle" data-toggle="dropdown" href="#"> <span class="glyphicon glyphicon-envelope"></span>Messenger<b class="caret"> </b></a> <ul class="dropdown-menu"> <li><a href="/profile"><span class="glyphicon glyphicon- user"></span>Konto</a></li> <li><a href="/about"><span class="glyphicon glyphicon- info-sign"></span>Über</a></li> <li><a href="#"><span class="glyphicon glyphicon-log- out"></span>Abmelden</a></li> </ul> </li> </ul> </div><!-- navbar collapse --> </nav> 在第一个循环中没有输出。因此,在[图3]中,程序存在问题。

1 个答案:

答案 0 :(得分:4)

我想按Enter键会导致CRLF\r\n)(在Windows上;在Linux上似乎工作正常),即两个空白字符。 read!只会阅读其中一个,而下一个read_line调用将返回一个空行(仅包含\n0x0a)的字符串。