Gle*_*ift 14 string integer type-conversion rust
注意此问题中的代码与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);
}
Run Code Online (Sandbox Code Playgroud)
我在控制台上输入一个数字(例如42)并打印我的程序None.
文档说这是一个正常的情况,当字符串格式不正确,但我的错误是什么42?
小智 18
你可以打电话str::parse(),但你需要确保它read_line正常工作.我们需要一位读者:
use std::io;
fn main() {
let reader = io::stdin();
}
Run Code Online (Sandbox Code Playgroud)
stdin读取处理输入流的全局缓冲区,并实现BufRead具有read_line方法方法的特征.这需要一个mutable 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");
}
Run Code Online (Sandbox Code Playgroud)
我们现在有我们想要转换成的输入文本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>();
}
Run Code Online (Sandbox Code Playgroud)
我们还没有完成,我们仍然需要确保使用模式匹配成功解析输入.将原始输入缓冲区转换为可用整数所需的所有代码是:
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);
}
Run Code Online (Sandbox Code Playgroud)
这编译没有错误或警告.
输入包括最后的换行符,如文档中所述read_line.这导致from_str()失败.使用std::str::trim()和更改此:
let input: Result<i32, _> = input_text.parse();
Run Code Online (Sandbox Code Playgroud)
进入这个:
let input: Result<i32, _> = input_text.trim().parse();
Run Code Online (Sandbox Code Playgroud)
似乎工作.
| 归档时间: |
|
| 查看次数: |
9412 次 |
| 最近记录: |