Petit probleme en c++

Utilisateur anonyme - 18 janv. 2006 à 16:33
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 19 janv. 2006 à 22:38
Bonjour à tous,

Alors je vous énonce mon petit problème:

Voila je suis étudiant en bts informatique et nous devons réaliser un programme permettant de définir à quelle classe appartient une adresse ip en langage C++. Pour cela nous devons réaliser des test pour vérifier que les chiffres saisies ne depassent pas 255 mais mon problème est que je voudrai saisir l'adresse en question sous la forme ***.***.***.*** mais je ne sais pas la maniere a adopter en c++ équivalante à
scanf("%d.%d.%d.%d", &a,&b,&c,&d); ce que j'avais pensé c'ete faire cin>>et le ranger dans un tableau mais apres je ne vois pas comment traiter les informations car chaque chiffre va se trouver dans une case de tableau.... Il ne doit pas etre possible de faire un cin>>a>>".">>b>>"." etc... je ne vois pas comment m'y prendre.

Si quelqu'un a une information et pourrai m'aider a ce sujet.
Je vous remercie d'avance.


Rafou.

33 réponses

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 janv. 2006 à 19:41
pour la vérification d'ip , j'avai fait le programme en VB6 (et oui j'était un vbtiste me frappé pas :p ).




Voici le code cela pourra p-e t'aider. Il est très simple a comprendre.
Ne te préocupe pas des label et autre, juste sur la vérification . Je
t'ai mit d'ailleur juste la procédure qui calcule les classes.



code :



Private Sub Command1_Click()

Dim no_ip As Integer



no_ip = Val(Textip1.Text)



If Textip1.Text "" Then Textip1.Text 0

If Textip2.Text "" Then Textip2.Text 0

If Textip3.Text "" Then Textip3.Text 0

If Textip4.Text "" Then Textip4.Text 0




If no_ip > 0 And Val(Textip2.Text) = 240
Then
'Ip de classe E



Labelipclass.Caption = "E"

Labelmasqsr.Caption = "255.255.255.255"

Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&

End If



If no_ip 255 Or Val(Textip2.Text) 255 Or
Val(Textip3.Text) 255 Or Val(Textip4.Text) 255 Then 'Broadcast



Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&

MsgBox "(BROADCAST)", vbOKOnly & vbInformation, "ATTENTION!"





End If



If no_ip 10 Or no_ip 172 Or no_ip = 192 Or no_ip >= 240 Then



Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&





End If



Else



MsgBox "Mauvaise adresse ip", vbOKOnly & vbExclamation, "erreur"

End If

End Sub



End Sub





Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Unload Me

Unload Form2

End Sub
0
Utilisateur anonyme
18 janv. 2006 à 19:47
Merci beaucoup mais j'arrive pas a tout comprendre il me semble en C++ qu'il y aurait enormement de test a faire... je suis en train de m'embrouiller ....


Rafou.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 janv. 2006 à 19:56
non c'est pas compliqué, je vais t'en expliquer un , c'est le mm pour les autres :

-----------------------------------------------------------------------------------

If no_ip > 0 And Val(Textip2.Text) <= 255 And Val(Textip3.Text)
<= 255 And Val(Textip4.Text) <= 255 Then 'Condition d'acceptation

------------------------------------------------------------------------------------

^ Cest la vérification pour voir si une adresse ip est valide .si no_ip
(c'est le premier nombre de l'adresse ip) est plus grand que 0 ET si le
2ième nombre de l'adresse ip est plus petit ou égale a 255 ET si le
3ième nombre est plus petit ou égale a 255 ET si le 4ième nombre est
plus petit ou égale a 255.

Jusque la , c'est pas compliqué ;)







---------------------------------------------------------------------------

If no_ip >= 1 And no_ip <= 126 Then 'Ip de classe A

---------------------------------------------------------------------------

^Si le 1er nombre de l'adresse ip est plus grand ou égale a 1 ET si il
est plus petit ou égale a 126 c'est une adresse ip de classe A.





----------------------------------------------------------------------------------

Labelipclass.Caption = "A"

Labelmasqsr.Caption = "255.0.0.0"

Labelpriv.Caption = "non"

Labelpriv.ForeColor = &H0&

----------------------------------------------------------------------------------

^Ca tu t'en fou c'est pour afficher le résultat avec des belles couleurs blablabla ;)





End If Fin du IF
0
Utilisateur anonyme
18 janv. 2006 à 20:09
Oui c'est vrai sa na pas l'air si compliqué que sa mais je t'avouerai que la je suis totalement perdu depuis que j'ai vu que pour les nombre inferieur a 3 chiffres sa ne marcher pas que sa ecrivai quelque chose de bizar bah je ne m'y retrouve plus


Rafou.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 janv. 2006 à 20:26
je regarderai demain, je doit y aller
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
18 janv. 2006 à 20:52
char ip[25];//ip a 6*4 + 1 au max (pour le final !!)
scanf("%s",ip);


int test = 1;
int i=0;
int a;
char chiffre[10];
while(i<25&&ip[i]!='.'&&ip[i]!='\0'){
for(int b=0;b<10;b++)chiffre[b]='\0';
for(a=0;a<10&&ip[i+a]!='.'&&ip[i+a]!='\0';a++)chiffre[a]=ip[i+a];
if(atoi(chiffre)>255||atoi(chiffre)<0){test=0;break;}
i+=a+1;
}
if(test){
//ip valide !!
printf("r");
}
else
{printf("d");
//ip invlaide
}

voila mon petit code corrigé;.. (je crois ... pas testé .. )
0
Utilisateur anonyme
18 janv. 2006 à 21:40
Bon je vous remercie mais la j'arrive plus a faire quoique ce soit je ne m'y retrouve plus je comprend pas comment isoler les parties des nombre en fonction du nombre de chiffre et a cause des points je suis un debutant c pe etre pour sa que j'ai trop du mal.....


Rafou.
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
19 janv. 2006 à 13:07
//ParseIP.c


#include <stdio.h>


int main(int argc, char **argv)
{
int i, count = 0;
char *p, *q, *buffer[16];
char **element = buffer;
char tmp[16];


if(argc < 2)
{
printf("\nUsage : %s xxx.xxx.xxx.xxx\nExemple: %s 127.0.0.1\n", argv[0], argv[0]);
getch();
return 0;
}
strcpy(tmp, argv[1]);
p = argv[1];


while(1)
{
if(*p == '.')
while(*++p == '.')
;


if(*p == '\0')
break;


element[count++] = q = p;


while(*q && *q != '.')
++q;


if(*q == '\0')
break;


*q = '\0';
p = q + 1;
}
element[count] = '\0';


printf("\nip == %s\n\n", tmp);

for(i = 0; i < count; i++)
printf("element[%d] == %s\n", i, element[i]);


getch();
return 0;
}
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 janv. 2006 à 17:25
Désolé pour hier, je devait partir.



Voila un code en C (j'ai mis en C++ de se que je me souvient a côté en commentaire).

Il te permet d'isoler le 1er nombre de l'adresse ip, étant donné que
c'est le plus important pour déterminer le type d'adresse Ip.
Facilement adaptable.



int main(void){

char szTabIP[15];

int iNo1[1];



printf("\n Entrer l'adresse ip :"); // cout<<"entre l'adresse IP";


scanf("%s",szTabIP);
// cin >>szTabIP;



/* Affiche l'adresse rentrée */

printf("\n IP : %s"); //cout <<"IP :"<<szTabIP;

getch();



/* Transforme caractères en nombre pour isoler le 1er nombre d el'ip */

for(int i=0;i<3;++i){

iNo1[i]=atoi(&szTabIP[i]);

}

printf("\n%d",iNo1[0]); //cout <<"Nombre 1"<<iNo1[0];



getch();

return 0;

}



Bon code

++
0
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
19 janv. 2006 à 17:35
Je sais encore a soualer avec mon code mais le voila (testé il marche) il permet d'isoler les nombres..


char ip[25];//ip a 6*4 + 1 au max (pour le final !!)
scanf("%s",ip);


int test = 1;
int i=0;
int a,c=0;
char chiffre[10];
int nbip[6];
while(i<25&&ip[i]!='.'&&ip[i]!='\0'){
for(int b=0;b<10;b++)chiffre[b]='\0';
for(a=0;a<10&&ip[i+a]!='.'&&ip[i+a]!='\0';a++)chiffre[a]=ip[i+a];
if(atoi(chiffre)>255||atoi(chiffre)<0){test=0;break;}
i+=a+1;
nbip[c++] = atoi(chiffre);
}
if(test){
//ip valide !!
printf("r");
}
else
{printf("d");
//ip invlaide
}

elles sont contenus dans nbip ...
0
Utilisateur anonyme
19 janv. 2006 à 18:34
Merci pour cette aide sa ma beaucoup aider j'ai fini par reussir a faire ce que je voulais voila je vous met le source dites moi ce que vous en pencez?!

Petite parenthèse rrk275 j'arrive toujours pas a comprendre a quoi correspond le 6*4+1=25 jvois pas concretement a quoi sa correspond?!

voici le code:


short test(short *);


void classip(short *);


void main()


{




short ip[4],ipv;


char c;


cout<<"Saisissez votre adresse IP sous la forme(***.***.***.***): ";


cin>>ip[0]>>c>>ip[1]>>c>>ip[2]>>c>>ip[3];


cin.ignore();




ipv=test(ip);


cout<<"\nIPv: "<255)||(ip[0]<0))


{


ipv=0;


}


else if(ip[1]>255||ip[1]<0)


{


ipv=0;


}


else if(ip[2]>255||ip[2]<0)


{


ipv=0;


}


else if(ip[3]>255||ip[3]<0)


{


ipv=0;


}




if(ipv==1)


{


cout<<"\nAdresse IP saisi: ";


for(int i=0;i<4;i++)


{


cout<<*(ip+i)<<".";


}


cout<<" est valide!"<<endl;


}


else


{


cout<<"\nAdresse IP saisi: ";


for(int i=0;i<4;i++)


{


cout<<*(ip+i)<<".";


}


cout<<" est invalide!"<<endl;


}


return ipv;


}


void classip(short *ip)


{


int mask=0x80,v;


v=ip[0]&mask;


if(v==0) cout<<"\nL'adresse IP saisi est de classe A!"<<endl;


else


{


mask=mask>>1;




v=ip[0]&mask;




if(v==0) cout<<"\nL'adresse IP saisi est de classe B!"<<endl;


else


{


mask=mask>>1;




v=ip[0]&mask;




if(v==0) cout<<"\nL'adresse IP saisi est de classe C!"<<endl;


else


{


mask=mask>>1;




v=ip[0]&mask;


if(v==0) cout<<"\nL'adresse IP saisi est de classe D!"<<endl;




else


{


//mask=mask>>1;


//v=ip[0]&mask;


/*if(v==0)*/ cout<<"\nL'adresse IP saisi est de classe E!"<<endl;


}








}


}


}


}


Désolé pour un si long code ma prof ma dit que c'ete une des manieres "simple" de faire apres j'essayerai d'autre chose de mon coté

merci a vous bonne soiree.


Rafou.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 janv. 2006 à 22:37
Bonsoir, 6*4+1=25 correspond à la taille de szIP pour rentrer une IP...regarde :
char szIP "155.142.100.215.325.156" // IP v6 24 caractère + le caractère de fin de chaine '\0', ça fait bien 25
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 janv. 2006 à 22:38
euh correction, "325" n'est pas possible, mpe suis trompé...tout ça pour faire une Ip au hasard possible en v6
0
Rejoignez-nous