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

时间:2014-11-13 22:24:21

标签: 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);
}

我在控制台上输入一个数字(例如42),我的程序打印None

The documentation says当字符串格式不正确时,这是正常情况,但我的42出了什么问题?

5 个答案:

答案 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!");

价: