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.

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;
    }
Sources.

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 ?