注意此问题中的代码与1.0之前版本的Rust有关,但Rust 1.0的答案已经更新。
我无法将字符串转换为整数。
fn main() {
let input_text = io::stdin()
.read_line()
.ok()
.expect("failed to read line");
let input: Option<int> = from_str(input_text.as_slice());
println!("{}", input);
}
我在控制台上输入一个数字(例如42),我的程序打印None
。
The documentation says当字符串格式不正确时,这是正常情况,但我的42
出了什么问题?
答案 0 :(得分:18)
您可以致电str::parse()
,但需要确保read_line
正常工作。我们需要一位读者:
use std::io;
fn main() {
let reader = io::stdin();
}
stdin
读取处理输入流的全局缓冲区,并实现具有BufRead
方法的read_line
method特征。这需要一个可变String
作为输入缓冲区,并从流中读取所有字节,直到达到换行符并将它们附加到缓冲区。 #expect()
方法展开Result
;如果它是Err
,它将对消息和原因感到恐慌。
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
}
我们现在要将输入文本转换为i32
。这是str::parse()
对我们有用的地方,只要我们给它一个解析类型。 str::trim()
是必要的,因为read_line
包含缓冲区的换行字节
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input = input_text.trim().parse::<i32>();
}
我们还没有完成,我们仍然需要确保使用模式匹配成功解析输入。将原始输入缓冲区转换为可用整数所需的所有代码是:
use std::io;
fn main() {
let reader = io::stdin();
let mut input_text = String::new();
reader.read_line(&mut input_text).expect("failed to read line");
let input_opt = input_text.trim().parse::<i32>();
let input_int = match input_opt {
Ok(input_int) => input_int,
Err(e) => {
println!("please input a number ({})", e);
return;
}
};
println!("{}", input_int);
}
编译时没有错误或警告。
答案 1 :(得分:8)
输入在最后包含换行符,如read_line
的文档中所述。这会导致from_str()
失败。使用std::str::trim()
并更改此内容:
let input: Result<i32, _> = input_text.parse();
进入这个:
let input: Result<i32, _> = input_text.trim().parse();
似乎有效。
答案 2 :(得分:4)
从Rust 1.14开始,The Rust Programming Language has this example:
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
您也可以再次使用相同的变量名称,新类型将&#34; shadow&#34;旧类型:
use std::io;
fn main() {
let mut input_text = String::new();
io::stdin()
.read_line(&mut input_text)
.expect("failed to read line");
let input: u32 = input_text.trim().parse()
.expect("Please type a number!");
}
答案 3 :(得分:3)
试试这个:
fn main() {
let input_text = std::old_io::stdin()
.read_line()
.ok()
.expect("failed to read line");
let input_number: Option<i32> = input_text.trim().parse().ok();
let number = match input_number{
Some(num) => num,
None => {
println!("Wrong input data! Input a number.");
return;
}
};
println!("{}", number);
}
答案 4 :(得分:-1)
为了将字符串转换为整数,我们使用trim和parse。字符串上的trim()方法将消除字符串开头和结尾的任何空格。
这意味着如果我们输入5并点击返回,猜测看起来像这样:5 \ n。 \ n表示'换行符',即回车键。 trim()摆脱了这一点,只留下我们的字符串。
字符串上的parse()方法将字符串解析为某种数字。由于它可以解析各种数字,我们需要给Rust一个关于我们想要的确切数字类型的提示。因此,让a_int:i32。猜测后冒号(:)告诉Rust我们要注释它的类型。 i32是一个整数,32位整数。如果出现错误,我们使用expect()方法崩溃。
let a_int: i32 = input_1.trim().parse()
.ok()
.expect("Please type a number!");
价: