Last active
April 4, 2022 21:41
-
-
Save murasesyuka/50f79a0f0dc0da72a4f3ce4429001060 to your computer and use it in GitHub Desktop.
sscanf impliment in rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #[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