Je suis nouveau dans la programmation C donc j'essaie d'écrire un morceau de code où j'ai besoin de prendre l'adresse IP en hexadécimal mais je ne savais pas comment faire. pour autant que je sache, je ne peux pas obtenir plusieurs entrées avec char mais avec int lorsque l'utilisateur entre "A" par exemple, il s'avère un nombre énorme. pour les entrées décimales, j'ai écrit quelque chose comme ceci
int main(){ int IP_1,IP_2,IP_3,IP_4; printf("Enter the IP address:\n"); scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4);
J'ai utilisé 4 variables parce que plus tard j'utiliserai ces nombres pour la conversion.
edit: désolé de ne pas avoir ajouté ceci, je ne peux utiliser ni l'hexadécimal% x ni les tableaux / chaînes
3 Réponses :
La valeur énorme lorsque vous entrez une lettre est que scanf ()
ne reconnaît pas la lettre comme entrée valide pour un int, et arrête la lecture, laissant le reste variables non attribuées.
Vous devez d'abord vérifier si vous avez lu autant de variables que vous le souhaitez:
if (c1>='A' && c1<='F') IP_1 = c1-'A'; else if (c1>='0' && c1<='9') IP_1 = c1-'0'; else IP_1 = 0; // OUCH! THIS IS AN ERROR IP_1 = IP_1 *16; if (c2>='A' && c2<='F') IP_1 = IP_1 + c2-'A'; else if (c2>='0' && c2<='9') IP_1 = IP_1 + c2-'0'; else IP_1 = 0; // OUCH! THIS IS AGAIN AN ERROR
Je pense que le meilleur moyen est de lire une chaîne, puis d'utiliser les fonctions qui existent déjà pour convertir une chaîne en IP (à savoir, inet_aton ()
).
Aussi, j'éviterais scanf
pour les chaînes, n'est pas sécurisé.
Voir https://ideone.com/aO9Nll pour une démonstration en direct et le code. p >
Veuillez mettre le code dans la réponse afin de la rendre autonome. ideone.com est une ressource tierce, donnant à votre réponse une durée de conservation en fonction de la durée pendant laquelle cette ressource conserve la pâte stockée
#include <stdio.h> int main() { unsigned int IP_1,IP_2,IP_3,IP_4; printf("Enter the IP address:\n"); scanf("%x %x %x %x",&IP_1,&IP_2,&IP_3,&IP_4); //storing in Hex format printf("%x %x %x %x",IP_1,IP_2,IP_3,IP_4); }
Utilisez
% x
pour prendre une entrée en hexadécimal,% d
est pour une entrée décimale.Mais la variable doit être
unsigned int
lorsque vous faites cela.Qui écrit les adresses IPv4 en hexadécimal? IPv4 est généralement décimal, IPv6 est hexadécimal.
La notation que vous regardez est «décimal pointé», pas hexadécimal. Vous devez vérifier la valeur de retour de
scanf ()
- assurez-vous qu'elle est 4 - avant d'utiliser les résultats. S'il y a une lettre dans les données, autre qu'après quelques chiffres pour le quatrième nombre, alors vous obtiendrez une valeur de retour inférieure à 4 (0..3, ou EOF s'il n'y a plus de données après avoir ignoré l'espace blanc).% hhu peut être utilisé pour traiter la valeur comme un caractère non signé
Pourquoi ne seriez-vous pas autorisé à utiliser% x? S'agit-il d'un devoir ou d'un défi de codage que vous devez relever?
@ChrisTaylor ouais et je ne suis pas autorisé à les utiliser
@jongspiration ok, mais êtes-vous autorisé à créer vos propres fonctions?
@Christophe ah j'ai oublié ceux-ci, non je ne peux pas utiliser de fonctions non plus, je dois tout faire uniquement dans la fonction du corps. Je sais que cela semble ridicule et dans le et ce code fera des centaines de lignes mais ...
@xing, il doit entrer au format formel: . . ***. *** (points compris) si vous avez quelque chose de plus grand que 255 (FF), il doit dites que l'entrée est invalide et reprenez-la. et je dois utiliser l'entrée pour le convertir en binaire.
@xing 00010001 depuis son hexadécimal 11