【问题标题】:Is there any other way of taking integer or float input rather than taking string input and convert it? [duplicate]有没有其他方法可以采用整数或浮点输入,而不是采用字符串输入并进行转换? [复制]
【发布时间】:2019-12-24 08:10:54
【问题描述】:

我在直接输入整数和浮点数时遇到问题。

我是 Rust 的初学者,在输入整数时遇到问题。我做了一些研究,但没有找到像 C++ 那样直接获取整数输入的方法。我只是想知道有没有其他可能的方式来获取整数输入而不需要字符串输入而不是阴影。

let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Error");
let input:i16 = input.trim().parse().unwrap();

【问题讨论】:

标签: rust


【解决方案1】:

您可以选择使用text_io crate 来实现您的目标。

您必须在 Cargo.toml 文件中包含 crate 名称和版本

[dependencies]
text_io = "0.1.7"

这是您想要的工作示例。

#[macro_use] 
extern crate text_io;
fn main() {
    let i: i32 = read!();
    print!("{}",i);
}

【讨论】:

  • 此解决方案不检查非整数输入,如果提供非整数输入,则会出现恐慌。这相当于 OP 问题中的 unwrap() 调用。
【解决方案2】:

@Faheem Uz Zaman 建议使用 text_io crate,这是一个很好的选择。但是,read! 宏确实与原始问题中的代码完全一样:将输入读入字符串变量,然后尝试将该字符串解析为 i32。

为了将来自终端的输入解析为 i32 变量,需要实现一些错误处理。问题中的代码是完整的并处理整数输入,只要输入确实是整数。

text_io crate 提供了一个允许错误输入的try_read! 宏。这是一个如何实现 try_read 的示例!宏,这需要添加可以添加到原始问题示例代码中的相同类型的错误处理:

use text_io::*;
fn main() {

    let i: i32 = match(try_read!()) {
        Ok(integer_read) => integer_read,
        Err(bad_string) => {
            eprintln!("Error: {}", bad_string);
            return;
        },
    };
    println!("{}",i);
}

这可以使用? 运算符来缩短,这需要调整 main() 的返回值:

use text_io::*;
fn main()-> Result<(), Error>{
    let i: i32 = try_read!()?;
    println!("{}",i);
    Ok(()) 
}

如果输入无法解析为 i32,这将打印解析错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多