Skip to content

Instantly share code, notes, and snippets.

@murasesyuka
Last active April 4, 2022 21:41
Show Gist options
  • Select an option

  • Save murasesyuka/50f79a0f0dc0da72a4f3ce4429001060 to your computer and use it in GitHub Desktop.

Select an option

Save murasesyuka/50f79a0f0dc0da72a4f3ce4429001060 to your computer and use it in GitHub Desktop.
sscanf impliment in rust
#[allow(unused)]
use std::io::{self, BufRead};
macro_rules! sscanf {
($str: expr, $( $t:ty ),+ ) => {{
let mut iter = $str.split_whitespace();
($(iter.next().unwrap().parse::<$t>().unwrap(),)+)
}};
($str: expr, $idt: ident, $( $t:ty ),+ ) => {{
let mut iter = $str.split($idt);
($(iter.next().unwrap().parse::<$t>().unwrap(),)+)
}};
($str: expr, $seq: expr, $( $t:ty ),+ ) => {{
let mut iter = $str.split($seq);
($(iter.next().unwrap().parse::<$t>().unwrap(),)+)
}}
}
macro_rules! sscanf2vec{
( $string:expr, $t:ty) => {{
$string.split_whitespace()
.map(|s| s.parse().unwrap())
.collect()
}};
( $string:expr, $seq:expr, $t:ty) => {{
$string.split($seq)
.map(|s| s.parse().unwrap())
.collect()
}}
}
fn main(){
let stdio = io::stdin();
for line in stdio.lock().lines() {
let l = line.unwrap();
let var1 = sscanf!(l, u32, u32, u32);
let var2 = sscanf!(l, ' ', u32, u32, u32);
let var3 = "";//sscanf!(l, char::is_whitespace, u32, u32, u32); //err =>
/*
error[E0223]: ambiguous associated type
--> prog.rs:25:31
|
25 | let var3 = sscanf!(l, char::is_whitespace, u32, u32, u32);
| ^^^^^^^^^^^^^^^^^^^ help: use fully-qualified syntax: `<char as Trait>::is_whitespace`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0223`.
*/
println!("{:?} {:?} {:?}", var1, var2, var3);
}
/*
* sscanf2vec
*/
let s1 = "1 2 3 4 5 6 7";
let v1: Vec<i32> = sscanf2vec!(s1, i32);
println!("{:?}", v1);
let s2 = "11;12;13;14;15;42";
let v2: Vec<i32> = sscanf2vec!(s2,";", i32);
println!("{:?}", v2);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment