【问题标题】:Can't parse String from stdin to floating-point - Rust [duplicate]无法将字符串从标准输入解析为浮点 - Rust [重复]
【发布时间】:2020-02-22 07:28:21
【问题描述】:

在 Rust 中将字符串类型值解析为浮点类型值时,使用
"let pi: f64 = 3.14".parse().unwrap(); 一切正常。

但是,当解析来自标准输入的 String 类型值时,即使它是完全相同的值,程序也会出现恐慌并抛出:

线程'main'在Err上的'称为Result::unwrap()时惊慌失措 值:ParseFloatError {种类:无效}',src/libcore/result.rs:999:5 注意:使用RUST_BACKTRACE=1 环境变量运行以显示 回溯。

我检查了值的类型,它一个字符串,所以我不明白错误是关于什么的,我也找不到任何与标准输入相关的东西(标准输入)和这个问题。有没有其他人遇到过这个?有没有防止恐慌的好方法?

这里有一些复制问题的代码:

use std::io::{stdin,stdout,Write};

fn main() {
    let mut s = String::new();

    println!("Give a number ");

    stdin().read_line(&mut s)
        .expect("Did not enter a correct string");

    let user_input: f64 = s.parse().unwrap();

    println!("{:?}", user_input)
}

提前致谢!

【问题讨论】:

  • 输入是否有尾随换行符?你可能需要去掉它。
  • "有没有防止恐慌的好方法?"不要调用会恐慌的方法? unwrap() 在实际程序中使用并不是一件好事。

标签: casting rust floating-point type-conversion


【解决方案1】:

非常感谢 Jeff Muizelaar 和 SCappella!

SCappella 指出有一个换行符导致类型转换失败,Jeff Muizelaar 指出向字符串“s”添加一个 trim() 方法将删除换行符,从而解决问题。

在意识到这是问题所在之后,我能够做一些更准确的谷歌搜索并找到this bit of Rust documentation。它解释了 read_line() 方法

"读取[s]所有字节,直到到达换行符(0xA字节)...一旦找到,所有 最多字节,并包括,分隔符(如果找到)将是 附加...”

【讨论】:

    【解决方案2】:

    根据 SCappella 的建议,需要删除新行。 以下将起作用:

    let user_input: f64 = s.trim().parse().unwrap();
    

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2020-08-30
      • 2021-06-30
      • 2017-09-30
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多