Rust的读入问题
  • 板块学术版
  • 楼主Caviar_X
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/1/18 09:41
  • 上次更新2023/10/28 12:05:17
查看原帖
Rust的读入问题
278124
Caviar_X楼主2022/1/18 09:41

Rust官方真正提供的读入函数只有一个stdin().read_line

这对于oier们是很麻烦的

所以,我提供以下函数和宏

macro_rules! scan {
    ( $( $x:ty ),+ ) => {{
        let mut string = String::new();
        stdin().read_line(&mut string).unwrap();
        let mut iter = string.split_whitespace();
        ($(iter.next().and_then(|word| word.parse::<$x>().ok()).unwrap(),)*)
    }}
}
fn read() -> Vec<i64> {
    let mut s = String::new();
    stdin().read_line(&mut s).unwrap();
    let v = s.split_whitespace().collect::<Vec<&str>>();
    v.iter().map(|i| i.parse::<i64>().unwrap()).collect()
}

注意事项

  1. scan宏返回的是一个tuple,所以只读入一个函数的时候需要处理

  2. read函数返回值的长度是可变的,所以说如果你输入了额外的数据也不会出现错误

  3. 使用的时候记得use std::io::stdin;

例子

use std::io::stdin;
macro_rules! scan {
    ( $( $x:ty ),+ ) => {{
        let mut string = String::new();
        stdin().read_line(&mut string).unwrap();
        let mut iter = string.split_whitespace();
        ($(iter.next().and_then(|word| word.parse::<$x>().ok()).unwrap(),)*)
    }}
}
fn read() -> Vec<i64> {
    let mut s = String::new();
    stdin().read_line(&mut s).unwrap();
    let v = s.split_whitespace().collect::<Vec<&str>>();
    v.iter().map(|i| i.parse::<i64>().unwrap()).collect()
}
fn main() {
    let n = scan!(i32).0;
    let s = read();
    println!("数组的长度 : {} , 是否等于n {}",s.len(),s.len() == (n as usize));
    println!("{:?}",s);
}

测试数据: 输入

5
1 2 3 4 5

源代码非常的简单,只需要知道迭代器即可

2022/1/18 09:41
加载中...