IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[C++.Net2003]Adresse IP


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut [C++.Net2003]Adresse IP
    Bonjour tout le monde,
    J'ai une TextBox et un Bouton
    et je veux, si on clike sur le bouton on vérifie que c'est adresse ip
    Voila que j'ai fait et je suis arrêtée car j'ai pas pu résoulu le problème
    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
    17
    18
     
    private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    {
    int len=0;
    len = (adresse_IP->ToString())->get_Length();
    if (String::Compare(adresse_IP->Text, "")==0) // champ vide
    {
    MessageBox::Show("Entrez une adresse IP", "Error");
    adresse_IP->Text="";
    adresse_IP->Focus();
    }
    else if (len > 15)
    {
    MessageBox::Show("Votre adresse est invalide!!!!!!!", "Error");
    adresse_IP->Text="";
    adresse_IP->Focus();
    } 
    }
    Merci d'avance!!!!!!!

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut Re: [C++.Net2003]Adresse IP
    Citation Envoyé par aziziti
    Bonjour tout le monde,
    J'ai une TextBox et un Bouton
    et je veux, si on clike sur le bouton on vérifie que c'est adresse ip
    Voila que j'ai fait et je suis arrêtée car j'ai pas pu résoulu le problème
    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
    17
    18
     
    private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    {
    int len=0;
    len = (adresse_IP->ToString())->get_Length();
    if (String::Compare(adresse_IP->Text, "")==0) // champ vide
    {
    MessageBox::Show("Entrez une adresse IP", "Error");
    adresse_IP->Text="";
    adresse_IP->Focus();
    }
    else if (len > 15)
    {
    MessageBox::Show("Votre adresse est invalide!!!!!!!", "Error");
    adresse_IP->Text="";
    adresse_IP->Focus();
    } 
    }
    Merci d'avance!!!!!!!
    Il faut que tu parses ta chaine (avec split) sur le caractère . et que tu vérifies qu'il y a bien quatres chaines en tout et que ce sont des chiffres

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 int len=0;
    				 int count=0;
    				 if (String::Compare(adresse_IP->Text, "")==0) // champ vide
    				 {
    					 MessageBox::Show("Entrez une adresse IP", "Error");
    				     adresse_IP->Text="";
    					 adresse_IP->Focus();
    				 }
    				 else
    				 {
    					 String* adrip = adresse_IP->Text->ToString();
                         Char chars[] = {'.'};
                         String* split[] = adrip->Split(chars);
    				     MessageBox::Show(adrip);
    				     IEnumerator* myEnum = split->GetEnumerator();
    				     while (myEnum->MoveNext())
    					 {
    						 String* s = __try_cast<String*>(myEnum->Current);
    					     if (!s->Trim()->Equals(S""))
    						 {
    							 //MessageBox::Show(s);
    							 if ((s>255)||(s<0))
    								 len++;
    							 count++;
    						 }
    					 }
    					 if(count!=4)
    					 {
    						 MessageBox::Show("Votre adresse est invalide!!!!!!!", "Error");
    					     adresse_IP->Text="";
    					     adresse_IP->Focus();
    					 }
    					 else if(len!=0)
    						 {
    							 MessageBox::Show("Votre adresse est invalide!!!!!!!", "Error");
    							 adresse_IP->Text="";
    							 adresse_IP->Focus();
    						 }
    					 else
    						 MessageBox::Show("Votre adresse est valide!!!!!!!", "Error");
    				 }				 
    			 }
    Voila ce que j'ai fait mais:
    1. error C2446: '>'*: pas de conversion de 'int' en 'System::String __gc *'
    2. error C2865: '<'*: comparaison non conforme entre des références et la classe __gc 'System::String'
    Qu'est-ce que je fait?
    Merci.

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Citation Envoyé par aziziti
    [code]if ((s>255)||(s<0))
    tu compares une chaine de caractères (s) à un nombre (255)

    il faut comparaer à une chaine de caractères "255" "0"

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((s->CompareTo("255")>0)||(s->CompareTo("0")<0))
    Oui tu as raison,
    j'ai résolu ce problème, mais
    si on traite ces exemples:
    127.0.0.1a
    12+.0.0.0

    le programme va considérer cette adresse comme valide, ce que je doit faire pour régler ce problème.
    Merci.

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu peux tester tous tes caractères avec Char::IsNumber par exemple

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Comment je peux passer de String* en char?
    Merci!!

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Tu utilises la propriétés chars
    n'hésite pas à consulter la msdn http://msdn.microsoft.com/library/de...charstopic.asp

  9. #9
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Dans le lien précédent j'ai trouvé cet exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Console::Write(S"Type a string : ");
    String* myString = Console::ReadLine();
    for (int i = 0; i < myString->Length; i ++)
        if(Uri::IsHexDigit(myString->Chars[i]))
            Console::WriteLine(S"{0} is a hexadecimal digit.", __box(myString->Chars[i])); 
        else
            Console::WriteLine(S"{0} is not a hexadecimal digit.", __box(myString->Chars[i]));
    j'ai pas compris c'est quoi Uri
    Merci

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Uri, c'est une classe .Net, tout est marqué dans msdn : http://msdn2.microsoft.com/en-us/lib...rs(VS.80).aspx

  11. #11
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 int len=0; 
    				 int count=0;
    				 Boolean verif=true;
    				 if (String::Compare(adresse_IP->Text, "")==0) // champ vide
    				 {
    					 MessageBox::Show("Entrez une adresse IP", "Information",MessageBoxButtons::OK,MessageBoxIcon::Information);
    				     adresse_IP->Text="";
    					 adresse_IP->Focus();
    				 }
    				 else
    				 {
    					 String* adrip = adresse_IP->Text->ToString();					 
                         Char chars[] = {'.'};
                         String* split[] = adrip->Split(chars);
    				     //MessageBox::Show(adrip);
    				     IEnumerator* myEnum = split->GetEnumerator();
    				     while (myEnum->MoveNext()&& verif==true)
    					 {
    						 String* s = __try_cast<String*>(myEnum->Current);
    					     if (!s->Trim()->Equals(S""))
    						 {
    							 //MessageBox::Show(s);							 
    							 if ((s->CompareTo("255")>0)||(s->CompareTo("0")<0))
    								 len++;
    							 for (int i = 0; i < s->Length; i ++)
    							 {
    								 if(Char::IsNumber(s,i))
    									 verif=true;
    								 else
    									 verif=false;
    							 }
    						 }
    						 count++;
    					 }
    					 if(verif!=true)
    					 {
    						 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    					     adresse_IP->Text="";
    					     adresse_IP->Focus();
    					 }
    					 else
    					 {
    						 if(count!=4)
    						 {
    							 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    					         adresse_IP->Text="";
    					         adresse_IP->Focus();
    					     }
    						 else if(len!=0)
    						 {
    							 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    							 adresse_IP->Text="";
    							 adresse_IP->Focus();
    						 }
    						 else
    							 MessageBox::Show("Votre adresse est valide!","Bravo",MessageBoxButtons::OK,MessageBoxIcon::Information);
    					 }
    				 }
    			 }
    Bonjour,
    Voilà j'ai ajouté un code pour indiquer que l'adresse est invalide si on a un tapé au moins un caractère, mais il reste un petit problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((s->CompareTo("255")>0)||(s->CompareTo("0")<0))
    Comme vous le savez tous, si on met par exemple 127.0.0.3
    le programme va indiquer que l'adresse est invalide alors que c'est pas le cas.
    En fait je veux savoir comment je peut convertir la chaîne en un Int par exemple et la comparer avec 0 et 255.
    J'ai utilisé et ça n'a pas marché.
    Merci d'avance.

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414

  13. #13
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Si on traite cet exemple 1+.0.0.3

    Une exception non gérée du type 'System.FormatException' s'est produite dans mscorlib.dll

    Informations supplémentaires*: Le format de la chaîne d'entrée est incorrect.
    Quoi faire :
    Merci.

  14. #14
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    mais, tester chaque caractère pour savoir s'il est numérique, comme on a dit au dessus

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    moi j'ai fait une fonction pour tester si une ip est valide, elle est un peu lourde et peut être pas trés optimisé mais elle marche

    Je te passerai ça des que j'aurait le temp (dans 2 jours max.)
    ...

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Je vient de revoir ma fonction (elle est en fait assez "merdique") il faudrait que je revienne un peu dessus.... a l'époque je connaissait trés peu les strings....
    Je la met quant même :

    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
    17
    18
    19
    20
    21
    22
     
    BOOL test_ip(const std::string str)
    {
       std::istringstream iss (str.c_str());
       std::string nb;
       int parties=0;
     
       //découpe les parties qui se trouve entre les "."
       while (std::getline( iss, nb, '.' ))   {
     
          //compare le nombre de chiffre au nombre de caractères
          if(((size_of(nb.c_str(),4)-1)!=(nb_chiffres(atoi2(nb.c_str()))))||(atoi2(nb.c_str())>=256))
             return 0;
     
          //compte le nombre de parties
          parties++;
       }
       if(parties==4)   //si les 4 parties ont été validées (IP valide)....
          return 1;
       else                 //sinon (ce qui veut dire qu'on n'a pas 4 parties
          return 0;
    }
    Il faudra aussi avoir ces fonctions :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //converti une char* en int 0 inclu (atoi() retourne 0 en cas d'erreur,
    //on ne peut donc pas convertir le 0) d'ou cette fonction :
    int atoi2(const char* chaine)
    {
    if((chaine[0]==48)&&(chaine[1]==0))   return 1;
    else
       if(atoi(chaine))
          return atoi(chaine);
       else   return -1;
    }
     
    //trouve le nombre de chiffres dans nombre
    int nb_chiffres(const int nb)
    {
       if(nb==0)   return 1;
       if(nb==1000) return 4;   //la je comprend pas pour 1000 ça retournait 3
    //j'ai donc ajouter cette ligne pour remédier au problème
       int nb_chi=0;
       while(nb>=pow(10,nb_chi))
       {
          nb_chi++;
       }
       return nb_chi;
    }
     
    //calcule la taille d'une chaine (nombre de caractères + 1 pour le 0 final
    int size_of(const char* ch,const int max)
    {
       int l;
       for(l=0;l<max;l++)
       {   
          if(ch[l]==0)   return l+1;
       }
       return l;
    }
    Comme vous le voyez le code est assez pitoyable (et peut être pas mal amélioré) mais le principe est la :
    -découpe de la chaine (l'IP)
    -on compare le nombre de chiffres au nombre de caractère dans chaque sous chaine que l'on vient de découper puis on vérifie que le nombre de la partie est bien compris entre 0 et 255 (inclu)
    -on vérifie que le nombre de sous chaine est bien de 4


  17. #17
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 43
    Par défaut
    Bonjour tout le monde,
    Maintenant la fonction marche très bien et voici le code:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 int len=0; 
    				 int count=0;
    				 int verif=0;
    				 if (String::Compare(adresse_IP->Text, "")==0) // champ vide
    				 {
    					 MessageBox::Show("Entrez une adresse IP", "Information",MessageBoxButtons::OK,MessageBoxIcon::Information);
    				     adresse_IP->Text="";
    					 adresse_IP->Focus();
    				 }
    				 else
    				 {
    					 String* adrip = adresse_IP->Text->ToString();					 
                         Char chars[] = {'.'};
                         String* split[] = adrip->Split(chars);
    				     //MessageBox::Show(adrip);
    				     IEnumerator* myEnum = split->GetEnumerator();
    				     while (myEnum->MoveNext()&&(verif==0))
    					 {
    						 String* s = __try_cast<String*>(myEnum->Current);
    					     if (!s->Trim()->Equals(S""))
    						 {
    							 //MessageBox::Show(s);							 
    							 for (int i = 0; i < s->Length; i ++)
    							 {
    								 if(Char::IsNumber(s,i))
    									 verif=verif+0;
    								 else
    									 verif=verif+1;
    							 }
    							 if (verif==0)
    							 {
    								 if((Convert::ToInt32(s)>255)||(Convert::ToInt32(s)<0))
    								 len++;
    							 }
    						 }
    						 count++;
    					 }
    					 if(verif!=0)
    					 {
    						 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    					     adresse_IP->Text="";
    					     adresse_IP->Focus();
    					 }
    					 else
    					 {
    						 if(count!=4)
    						 {
    							 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    					         adresse_IP->Text="";
    					         adresse_IP->Focus();
    					     }
    						 else if(len!=0)
    						 {
    							 MessageBox::Show("Votre adresse est invalide!", "Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);
    							 adresse_IP->Text="";
    							 adresse_IP->Focus();
    						 }
    						 else
    							 MessageBox::Show("Votre adresse est valide!","Bravo",MessageBoxButtons::OK,MessageBoxIcon::Information);
    					 }
    				 }
    			 }
    Merci tout le monde.
    Bonne programmation!!

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Citation Envoyé par damien99
    Je vient de revoir ma fonction (elle est en fait assez "merdique") il faudrait que je revienne un peu dessus.... a l'époque je connaissait trés peu les strings....
    J'ai recodée la fonction, elle est beaucoup plus propre maitenant :
    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
    17
    18
    19
    20
    21
    22
    /********** Teste si l'IP est valide **********/
    int test_ip(std::string ip)
    {
       if((ip.find_first_not_of("0123456789.")!=-1)||(inet_addr(ip.c_str())==INADDR_NONE))
          return 0;
     
       std::istringstream iss (ip);
       std::string part;
       int nb_part=0, nb;
     
       while(std::getline( iss, part, '.' ))
       {
          nb_part++;
          (std::istringstream)part >> nb;
          if((nb<0)||(nb>255)||((part[0]=='0')&&(part.length()!=1)))
             return 0;
       }
       if(nb_part!=4)
          return 0;
       else
          return 1;
    }
    retourne 1 si l'IP est valide et 0 si elle ne l'est pas.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26
  2. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  3. changer l'adresse d'un fichier...
    Par cava dans le forum C
    Réponses: 6
    Dernier message: 05/06/2002, 12h22
  4. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo