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

15

注意 这个问题中的代码适用于 Rust 1.0 之前的版本,但答案已经更新为 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

文档说明表明,当字符串格式不正确时,这是正常情况,但我的42有什么问题呢?

5个回答

19

你可以调用str::parse(),但要确保read_line正常工作。我们需要一个读取器:

use std::io;

fn main() {
    let reader = io::stdin();
}
stdin 读取处理输入流的全局缓冲区,并实现BufRead特质,其中包括read_line方法。该方法需要一个可变的String类型的输入缓冲区,读取流中的所有字节,直到遇到换行符并将它们添加到缓冲区中。#expect()方法解包结果;如果是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);
}

这个编译没有错误或警告。


8

read_line的文档中已经解释过,输入包含一个换行符。这会导致from_str()失败。可以使用std::str::trim()来修改如下内容:

let input: Result<i32, _> = input_text.parse();

转化为这样:

let input: Result<i32, _> = input_text.trim().parse();

看起来有效。


4
截至Rust 1.14版本,The Rust Programming Language有这个例子:
let guess: u32 = guess.trim().parse()
    .expect("Please type a number!");

您也可以再次使用相同的变量名称,新类型将“遮盖”旧类型:

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

试试这个:

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);
}

此答案涉及到 old_io 模块,该模块在 Rust 1.0 中已不再可用;因此此答案已经失效。 - Shepmaster

-1

为了将字符串转换为整数,我们使用trim和parse。字符串上的trim()方法将消除字符串开头和结尾的任何空格。

这意味着如果我们输入5并按回车键,guess看起来像这样:5\n。 \n表示“换行符”,即回车键。 trim()会去掉它,只留下数字5。

字符串上的parse()方法将字符串解析为某种数字。由于它可以解析各种数字,因此我们需要给Rust一个提示,告诉它我们想要的确切数字类型。因此,让a_int:i32。冒号(:)告诉Rust我们将注释其类型。 i32是一个整数,三十二位整数。我们使用expect()方法在出现错误时崩溃。

 let a_int: i32 = input_1.trim().parse()
 .ok()
 .expect("Please type a number!");

参考:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接