Bonjour à tous,
La fonction sscanf du C n'étant pas sécurisée, et donc presque inutilisable, j'ai décidé de coder un équivalent [extensible] en c++11 moderne.
Prototypes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 (1) template <class... Outs> string::const_iterator cpp_sscanf::sscanf( string input, string pattern, char delimiter, Outs&... output_arguments );
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 (2) template <class Iterator, class... Outs> Iterator cpp_sscanf::sscanf( Iterator begin, Iterator end, string pattern, char delimiter, Outs&... output_arguments );
Fonctionnalités.
- La fonction sscanf parse une chaine (input) de caractère selon un format fourni (pattern) et en extrait des valeurs (output_arguments).
- Elle retourne un itérateur vers la position où le parsing s'est arrêté.
- Les types pris en charge pour la sortie sont extensibles, via des type_traits.
- Grâce au c++, cette version est plus rapide que celle du C.
- Plus rapide que les std::istream (qui sont abominablement lents), et surtout, plus lisible.
- Bonne gestion des erreurs grâce aux exceptions.
- Testée.
Mini exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cpp_sscanf::sscanf( "j'ai 10 ans" , "j'ai _ ans" , '_' , mon_age );
Exemple.
Sources.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include "cpp_sscanf.h" #include "parser_trait.h" #include <string> using namespace std; int main(){ string chaine_a_tester = ...; string pattern = "Julien : _ ans, Diane : _ ans"; double age_julien; double age_diane; cpp_sscanf::sscanf( chaine_a_tester , pattern , '_' , age_julien, age_diane ); cout << "l'age de Julien est : " << age_julien << endl; cout << "l'age de Diane est : " << age_diane << endl; }
Les sources, les tests et le readme sont là :
https://bitbucket.org/Gauss_/library...anf/?at=master
Votre avis.
Qu'en pensez-vous ? Peut-on améliorer le code ? Cela vous semble-t-il utile ?
Partager