Je suis débutante en langage C et je rencontre un problème.
Je souhaiterai que l'utilisateur entre une adresse IP mais je voudrais en contrôler la saisie.
Pour cela j'ai pensé à mettre la saisie dans une chaîne de caractère, puis contrôler le nombre de points entre les chiffres mais il faut aussi regarder si les chiffres sont bien entre 0 et 9 pour éviter 192.bddv.63.21 par exemple.. C'est là où se situe mon problème, je ne sais pas faire.. Car il y a les caractères point qui m’embêtent.
J'ai vu que je pouvais utiliser la fonction strtok pour enlever les points mais si je fais ça je ne pourrais plus contrôler chaque chiffre..
J'espère avoir été claire, désolé si ce n'est pas le cas.
Tu peux donc vérifier les points en contrôlant que ip[3], ip[7] et ip[10] soient bien égaux au caractère '.'
Pour les chiffres, tu peux utiliser la fonction atoi (ASCII to Integer) qui te donne la valeur numérique d'un caractère ASCII ( '6' te donnera 6). Tu n'as donc plus qu'a utiliser cette fonction sur ip[0], ip[1], ... pour effectuer tes vérifications.
strlen renvoie le nombre de caractère jusqu'au '\0' final mais sans le compter.
Donc là tu demande à ta boucle de t'arrêter 2 caractères avant la fin (à cause également de l'inférieur strict) ce qui évite le .0 final qui devrait faire une erreur.
En effet, je viens de vérifier la valeur de compt en l'affichant et en modifiant ma condition :)
Merci encore :)
Une dernière petite question..
Pour vérifier que mes valeurs sont bien entre 0 et 255 il faut que j'utilise strtok pour enlever les points puis atoi() pour convertir et vérifier c'est bien ça?
Il y a plein de méthodes. Je ne suis pas fan de l'idée de modifier la chaine de caractères personnellement. Je pense que je créerais une seconde chaine de caractères plus courte (de 1 à 3 chiffres), que je remplirai avant le premier point, comparerait à 0 et 255, petit free, je passe au 2ème petit groupe de chiffres... A toi de voir, si tu préfères strtok. Le mieux quand tu codes c'est pas de te poser de questions, c'est d'essayer, de voir quels sont tes problèmes, et d'ajuster. Si tu demandes avant d'essayer une méthode à chaque fois tu risques d'apprendre beaucoup plus lentement. Jette toi à l'eau, fais tes algos tente ta logique
J'ai tapé ça vite fait, si tout va bien ça devrait compiler et fonctionner.
int IsValidIp(char* szIP)
{
int isValid;
int i;
unsigned char byte;
int iIpLen;
char dotCount;
isValid = 1;
iIpLen = strlen(szIP);
dotCount = 0;
// Si on nous donne une chaine de caractère vide ou bien que la chaine dépasse les 15 caractères ce n'est pas une bonne IP
if(iIpLen == 0 || iIpLen > 15)
{
isValid = 0;
}
else
{
/* On récupère le premier octet */
byte = (unsigned char)atoi(szIP);
/* S'il est plus grand que 255 alors ce n'est pas une IP valide */
if(byte > 255)
{
isValid = 0;
}
/* on parcours la chaine */
for(i = 0; i < iIpLen && isValid == 1; i++)
{
/* on compte le nb de point */
if(szIP[i] == '.')
{
dotCount ++;
/* puis on check si l'octet que l'on récupère est valide */
byte = (unsigned char)atoi(&szIP[i+1]);
if(byte > 255)
{
isValid = 0;
}
}
}
/* s'il n'y a pas trois points dans l'ip alors ce n'est pas une ip valide */
if(dotCount != 3)
{
isValid = 0;
}
}
return isValid;
}
int IsValidIp(char* szIP)
{
int isValid;
int i;
unsigned char byte;
int iIpLen;
char dotCount;
isValid = 1;
iIpLen = strlen(szIP);
dotCount = 0;
// Si on nous donne une chaine de caractère vide ou bien que la chaine dépasse les 15 caractères ce n'est pas une bonne IP
if(iIpLen == 0 || iIpLen > 15)
{
isValid = 0;
}
else
{
/* On récupère le premier octet */
byte = (unsigned char)atoi(szIP);
/* S'il est plus grand que 255 alors ce n'est pas une IP valide */
if(byte > 255)
{
isValid = 0;
}
/* on parcours la chaine */
for(i = 0; i < iIpLen && isValid == 1; i++)
{
/* on check si on nous donne bien seulement des chiffres ou le point */
if(!(szIP[i] >= '0' && szIP[i] <= '9') && szIP[i] != '.')
{
isValid = 0;
}
/* on compte le nb de point */
if(szIP[i] == '.')
{
dotCount ++;
/* puis on check si l'octet que l'on récupère est valide */
byte = (unsigned char)atoi(&szIP[i+1]);
if(byte > 255)
{
isValid = 0;
}
}
}
/* s'il n'y a pas trois points dans l'ip alors ce n'est pas une ip valide */
if(dotCount != 3)
{
isValid = 0;
}
}
return isValid;
}
- Edité par Woosterfield 15 juillet 2013 à 20:30:32
Non, en faite atoi() prend en compte les premiers chiffres qu'il voit jusqu’à ce qu'il y ai un null byte ou bien autre chose, le soucis vient du fait que j'ai converti ce que atoi() me renvoi en unsigned char, ce qui limite le résultat à 255, donc ça retourne toujours vrai.
Voila la fonction fonctionnelle, (cette fois ci je l'ai testée :P)
int IsValidIp(char* szIP)
{
int isValid;
int i;
int byte;
int iIpLen;
char dotCount;
isValid = 1;
iIpLen = strlen(szIP);
dotCount = 0;
// Si on nous donne une chaine de caractère vide ou bien que la chaine dépasse les 15 caractères ce n'est pas une bonne IP
if(iIpLen == 0 || iIpLen > 15)
{
isValid = 0;
}
else
{
/* On récupère le premier octet */
byte = atoi(szIP);
/* S'il est plus grand que 255 alors ce n'est pas une IP valide */
if(byte > 255)
{
isValid = 0;
}
/* on parcours la chaine */
for(i = 0; i < iIpLen && isValid == 1; i++)
{
/* on check si on nous donne bien seulement des chiffres ou le point */
if(!(szIP[i] >= '0' && szIP[i] <= '9') && szIP[i] != '.')
{
isValid = 0;
}
/* on compte le nb de point */
if(szIP[i] == '.')
{
dotCount ++;
/* puis on check si l'octet que l'on récupère est valide */
byte = atoi(&szIP[i+1]);
if(byte > 255)
{
isValid = 0;
}
}
}
/* s'il n'y a pas trois points dans l'ip alors ce n'est pas une ip valide */
if(dotCount != 3)
{
isValid = 0;
}
}
return isValid;
}
- Edité par Woosterfield 16 juillet 2013 à 22:42:08
Bonsoir ! Quand tu posteras ta demande dans le forum C++, et dans un nouveau sujet, n'oublie pas de préciser en détail de quelle aide tu as besoin. (Là, en l'absence de précision, on risque de croire que tu veux qu'on fasse le boulot à ta place.)
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire
Objectif Zéro Bug - le test logiciel professionnel | L'électronique de zéro | Tableaux & pointeurs | Pointeurs sur fonctions | Lecture/écriture binaire