Не удается разобрать строку из стандартного ввода с плавающей точкой - Rust - PullRequest
0 голосов
/ 26 октября 2019

При разборе значения типа String на значение типа с плавающей точкой в ​​Rust все работает нормально"let pi: f64 = 3.14".parse().unwrap();.

Однако при синтаксическом анализе значения типа String, полученного из стандартного ввода, даже если оно точно такое же значение, программа паникует и выдает:

thread 'main'panicked at' вызывается Result::unwrap() для значения Err: ParseFloatError {kind: Invalid} ', src / libcore / result.rs: 999: 5 note: запускать с переменной окружения RUST_BACKTRACE=1 для отображения обратной трассировки.

Я проверил тип значения, и оно является Строкой, поэтому я не понимаю, в чем заключается ошибка, и я не смог найти ничего, связанного конкретно сстандартный ввод (stdin) и эта проблема. Кто-нибудь еще сталкивался с этим? Есть ли хороший способ предотвратить панику?

Вот некоторый код, чтобы повторить проблему:

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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Как предложено SCappella, новую строку необходимо удалить. Будет работать следующее:

let user_input: f64 = s.trim().parse().unwrap();
0 голосов
/ 26 октября 2019

Большое спасибо Джеффу Муизелаару и SCappella!

SCappella указал, что есть символ перевода строки, приводящий к сбою преобразования типа, и Джефф Муизелаар указал, что добавление метода trim () в String "s, "удалил бы новую строку, решив проблему.

После того, как я понял, что это была проблема, я смог сделать более точный поиск в Google и нашел этот бит документации по Rust . Это объясняет, что метод read_line ()

"считывает [s] все байты до тех пор, пока не будет достигнут символ новой строки (байт 0xA) ... Как только найден, все байты до, включительно, разделитель (если найден) будет добавлен ... "

...