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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 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.


  18. #18
    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!!

+ 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