gilou Modérateur Modzilla | J'aurais essayé un truc dans ce style ci:
Code :
- #include <boost/regex.hpp>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <bitset>
- using namespace std;
- int main ()
- {
- // d'abord, on lit les données utilisateur
- string user_input;
- cin.exceptions(istream::failbit | istream::badbit);
- try {
- cout << "Veuillez taper l'adresse IPv4." << endl;
- getline(cin, user_input);
- } catch(istream::failure e) {
- cout << "Erreur a la lecture des donnees!" << endl;
- return -1;
- }
- // On verifie que c'est bien quelque chose de la forme voulue
- string const ipv4_pattern = "^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$";
- if ( boost::regex_match(user_input.begin(), user_input.end(), boost::regex(ipv4_pattern)) == false ) {
- cout << "Ce n'est pas une adresse IP!" << endl;
- return -1;
- }
- int ipv4[4] = {0, 0, 0, 0};
- // on remplace les . par des blancs pour l'opérateur >>
- replace(user_input.begin(), user_input.end(), '.', ' ');
- // et on lit comme une suite de 4 chiffres
- istringstream iss(user_input);
- for (unsigned i = 0; i != 4; ++i) {
- iss >> ipv4[i];
- if (ipv4[i] > 255) {
- cout << "Ce n'est pas une adresse IP!" << endl;
- // cout << (i+1) <<"e-partie de l'adresse IP trop grande!" << endl;
- return -1;
- }
- }
- // et tu fais ce que tu as a faire avec ipv4 a partir d'ici.
- // ici j'imprime avec la valeur binaire
- for (unsigned i = 0; i != 4; ++i) {
- cout << bitset<8>(ipv4[i]);
- if (i == 3) {
- cout << endl;
- } else {
- cout << ".";
- }
- }
- return 0;
- }
|
On récupère l'input utilisateur, et on la valide avec une expression régulière simple. J'utilise celle de la librairie boost, car celle de g++ est inexistante et inutilisable.
Si ton compilo a une implémentation correcte de C++11 (ça doit marcher avec celui de Microsoft par exemple), on peut utiliser la librairie standard, en transformant le source comme:
#include <boost/regex.hpp> -> #include <regex>
et if ( boost::regex_match(user_input.begin(), user_input.end(), boost::regex(ipv4_pattern)) == false ) { -> if ( regex_match(user_input.begin(), user_input.end(), regex(ipv4_pattern, regex_constants::ECMAScript)) == false ) { Si l'expression régulière a matché l'input utilisateur, on remplace les . par des blancs pour lire avec >> comme une suite de 4 nombres, qu'on range dans un tableau après avoir vérifiés qu'ils ne dépassent pas 255.
A+, Message édité par gilou le 12-01-2013 à 20:47:02 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|