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.
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 18 janv. 2006 à 17:09
Pourquoi est ce un problème que les chiffres ce trouve dans un tableau
?? si je te comprent bien ton tableau contiendra pour exemple ceci:
255.(heu ça ne feras pas un . mais je connai pas sont code par coeur)255.255.255.255 (broadcast, ip de classe E :) ).
Il te suffira alors de parcours le tableau 4 à 4 (tous en ignorant le
point donc 3-1). Avec une boucle for le tour est joué.Bon c'est vrai
que cela serai moin pratique , mais tout a fait faisable.
Maintenant pour le format en C++ je saurai pas t'aider.
peut etre : cin>>a>>'.'>>b>>'.'>>c>>'.'>d mais je suis pas sur.
Mais la je viens de faire un tableau je rentre bien l'adresse ip dedans qd je l'affiche j'obtiens bien ce que j'ai tapé! Mais ce qui me gène c'est pour isoler les chiffres je suis tout a fait d'accord il faut faire une boucle for mais je vois pas comment le mettre dans des variables pour retraiter c'est information.
Je vous pries de bien vouloir m'excuser je suis débutant en programation
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 18 janv. 2006 à 17:25
bah tu parcours et tu teste le nombre avec atoi ..
int test = 1;
for(int i=3;i<25:i+=4)ip[i]='\0';//on trasforme chaque point en fin de chaine..
for(int i=0;i<25:i+=4)if(atoi(ip[i])>255||atoi(ip[i])<0)test=0;
if(test){
//ip valide !!
}
else
{
//ip invlaide
}
Je vous prie de m'excuser pour les posts repetitif precedent je n'ai pas fait expres.
Merci a vous deux, et je voulais savoir rrk275 pk tu fais un for avec la valeur 25 ya pas 25 caractere dans le tableau yen a 16 , peut etre que je me trompe et je comprend pas ton test=0, si tu pouvais m'expliquer pourquoi. je te prie de m'excuser je suis un peu fatigué.
En tout cas je vous remercie beaucoup pour votre aide.
rrk275 j'ai trouver la solution pour le atoi(ip[i]) qui genere une erreur, la solution c'est de mettre atoi(ip+i) au lieu de atoi(ip[i]). Grace a l'exemple de Arnotic.
Je vous remercie tous pour votre aide! Merci beaucoup!
J'aurais une derniere question a quoi sert explicitement de remplacer les point contenu dans le tableau par '\0' cela permet d'utiliser la fonction atoi ?!
Si c'est ce que je comprend, si l'on ne remplacé pas les "." par "\0" il serait impossible d'utiliser atoi pour les 4 "paquets" de chiffres car si l'on utilise atoi comme sa renvoi seulement la valeur de gauche situé avant le premier "." c'est bien cela?
Merci a vous tous j'ai reussi a faire ceci mais il me reste un dernier detail a faire c la repartition de classe comment je peux faire dans un if pour dire que la classe A va de 1.0.0.0 a 127.0.0.0 j'arrive pas a me schematiser sa?! Es possible?
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 18 janv. 2006 à 18:32
"J'aurais une derniere question a quoi sert explicitement de remplacer
les point contenu dans le tableau par '\0' cela permet d'utiliser la
fonction atoi ?!"
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 18 janv. 2006 à 18:35
bah
atoi ne connait pas la taille il cherche donc le caractere de fin de chaine ...
(j'espere que c'est pas inutile parce qu'il parait que je fais plein de messages inutiles ... )
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 18 janv. 2006 à 18:37
rkk275 : "un chiffre ne depasse 255 qu'en base 256 ... ou
plus" Pourquoi parle tu de base? le 255 est la limite d'un nombre dans
une adresse ip (je dirai mm 254 car 255 est utilisé pour le
broadcast et aussi pour le masque de sous réseaux), tu peu pas mettre
plus haut. Donc c'est pour ça que je comprend pas ce que tu a dit.
Je viens d'essayer sans mettre la boucle for ki remplace le "." en "\0" et le programme marche encore donc je sais pas trop mais sans doute que c'est utile?!
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 18 janv. 2006 à 18:47
nan je parlais de base uniquement parce qu'il a employé le mot chiffre a la place de nombre (rien de tres important mais dans certaines situations ca porte a confusion...)
"rrk275 j'ai trouver la solution pour le atoi(ip[i]) qui genere une erreur, la solution c'est de mettre atoi(ip+i) au lieu de atoi(ip[i]). "
??
nan pas tt a fait atoi demande une const char * et donc il fallait mettre atoi(&ip[i])
25 pourquoi 25 parce que de nouvelle IP sont a 6 nombres.. ca s'appelle ip v6 .. et comme je l'ai deja dit 6*4+1 = 25
Petite parenthese si l'on rentre autre chose que "255.255.255.255" par exemple "0.0.0.0" d'incrementer le atoi(ip+4) par exemple bah sa foire car le "0" ne prend qu'une case dans lem tableau et "255" prend 3 cases c'est pas contradictoire?! ou soit les valeur sont interpreter en binaire?!
pour toute les valeurs inferieur à 100 donc ne comportant que 2 chiffres sa ne marche pas!!! Il faudrai sans doute tenir compte du nombre de chiffre entre chaque point je pense?! mais comment faire tel est la question?!
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 18 janv. 2006 à 19:32
pour info une adresse ip peut contenir dans 0 ex : 127.0.0.0
(localhost,Classe B mais ip réservé ;) ). Bon il est vrai que si
l'adresse commence par 0 cela est faut.
il suffit alors de voir si le premier nombre est différent de 0.