在Rust中将字符串切片转换为int

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)

这编译没有错误或警告.


Erc*_*den 8

输入包括最后的换行符,如文档中所述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)

似乎工作.