web-dev-qa-db-ja.com

Rust 1.0)でユーザーから整数入力を読み取る方法は?

私が見つけた既存の回答はすべて_from_str_( コンソールからのユーザー入力の効率的な読み取り など)に基づいていますが、from_str(x)x.parse() in Rust 1.0。初心者として、この変更を考慮して元のソリューションをどのように適応させるべきかは明らかではありません。

Rust 1.0以降、ユーザーから整数入力を取得する最も簡単な方法は何ですか?

これは、すべてのオプションの型注釈とエラー処理を備えたバージョンです。これは、私のような初心者に役立つ場合があります。

use std::io;

fn main() {
    let mut input_text = String::new();
    io::stdin()
        .read_line(&mut input_text)
        .expect("failed to read from stdin");

    let trimmed = input_text.trim();
    match trimmed.parse::<u32>() {
        Ok(i) => println!("your integer input: {}", i),
        Err(..) => println!("this was not an integer: {}", trimmed),
    };
}
36
Michael

おそらく最も簡単な部分は text_io crate を使用して次のように記述することです:

#[macro_use]
extern crate text_io;

fn main() {
    // read until a whitespace and try to convert what was read into an i32
    let i: i32 = read!();
    println!("Read in: {}", i);
}

複数の値を同時に読み取る必要がある場合は、Rust nightlyを使用する必要があります。

以下も参照してください。

11
Daniel Fath

いくつかの可能性があります(Rust 1.7):

use std::io;

fn main() {
    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    let n: i32 = n.trim().parse().expect("invalid input");
    println!("{:?}", n);

    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    let n = n.trim().parse::<i32>().expect("invalid input");
    println!("{:?}", n);

    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    if let Ok(n) = n.trim().parse::<i32>() {
        println!("{:?}", n);
    }
}

これらは、追加のライブラリに依存することなく、パターンマッチングの儀式を省きます。

8
qed

parseはほぼ同じです。 read_line今は不愉快です。

use std::io;

fn main() {
    let mut s = String::new();
    io::stdin().read_line(&mut s).unwrap();

    match s.trim_right().parse::<i32>() {
        Ok(i) => println!("{} + 5 = {}", i, i + 5),
        Err(_) => println!("Invalid number."),
    }
}
4
Ry-

Codechefやcodeforcesなど、text_ioへのアクセス権がないWebサイトでの競争力のあるプログラミングの目的で入力を読み取る方法を探している場合。

これは、上記の回答で述べたものを読むための新しい方法ではなく、自分のニーズに合わせて変更しただけです。

次のマクロを使用して、stdinからさまざまな値を読み取ります。

use std::io;

#[allow(unused_macros)]
macro_rules! read {
    ($out:ident as $type:ty) => {
        let mut inner = String::new();
        io::stdin().read_line(&mut inner).expect("A String");
        let $out = inner.trim().parse::<$type>().expect("Parseble");
    };
}

#[allow(unused_macros)]
macro_rules! read_str {
    ($out:ident) => {
        let mut inner = String::new();
        io::stdin().read_line(&mut inner).expect("A String");
        let $out = inner.trim();
    };
}

#[allow(unused_macros)]
macro_rules! read_vec {
    ($out:ident as $type:ty) => {
        let mut inner = String::new();
        io::stdin().read_line(&mut inner).unwrap();
        let $out = inner
            .trim()
            .split_whitespace()
            .map(|s| s.parse::<$type>().unwrap())
            .collect::<Vec<$type>>();
    };
}

主に


fn main(){
   read!(x as u32);
   read!(y as f64);
   read!(z as char);
   println!("{} {} {}", x, y, z);

   read_vec!(v as u32); // Reads space separated integers and stops when newline is encountered.
   println!("{:?}", v);
}

注:私は違いますRust専門家、それを改善する方法があると思われる場合は、私に知らせてください。それは私に役立ちます。ありがとう。

3
coder3101

単純な構文が必要な場合は、拡張メソッドを作成できます。

use std::error::Error;
use std::io;
use std::str::FromStr;

trait Input {
    fn my_read<T>(&mut self) -> io::Result<T>
    where
        T: FromStr,
        T::Err: Error + Send + Sync + 'static;
}

impl<R> Input for R where R: io::Read {
    fn my_read<T>(&mut self) -> io::Result<T>
    where
        T: FromStr,
        T::Err: Error + Send + Sync + 'static,
    {
        let mut buff = String::new();
        self.read_to_string(&mut buff)?;

        buff.trim()
            .parse()
            .map_err(|e| io::Error::new(io::ErrorKind::InvalidInput, e))
    }
}

// Usage:

fn main() -> io::Result<()> {
    let input: i32 = io::stdin().my_read()?;

    println!("{}", input);

    Ok(())
}
1
Boiethios

私は間違いなくRust-Langが提供するファイルシステムを使用しますstd::fs(詳しくはこちらをご覧ください: https://doc.Rust-lang.org/stable/std/fs/ )ただし、より具体的には https://doc.Rust-lang。 org/stable/std/fs/fn.read_to_string.html

テキストファイルの入力を読みたいだけだとしましょう、これを試してください:

use std::fs
or
use std::fs::read_to_string

fn main() {
    println!("{}", fs::read_to_string("input.txt"));   
}
0
rust