我已经完成了对#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]中,程序存在问题。
答案 0 :(得分:4)
我想按Enter键会导致CRLF
(\r\n
)(在Windows上;在Linux上似乎工作正常),即两个空白字符。 read!
只会阅读其中一个,而下一个read_line
调用将返回一个空行(仅包含\n
(0x0a
)的字符串。