analyse de l'adresse ip de chaîne de 4 octets
Je suis de la programmation sur un MCU avec le C et j'ai besoin d'analyser une chaîne se terminant par null qui contient une adresse IP sur 4 octets. J'ai fait un exemple avec C++:
#include <iostream>
int main()
{
char *str = "192.168.0.1#include <iostream>
int main()
{
char *str = "192.168.0.1\0";
while (*str != '\0')
{
if (*str == '.')
{
*str++;
std::cout << std::endl;
}
std::cout << *str;
*str++;
}
std::cout << std::endl;
return 0;
}
";
while (*str != '#include <iostream>
int main()
{
char *str = "192.168.0.1\0";
while (*str != '\0')
{
if (*str == '.')
{
*str++;
std::cout << std::endl;
}
std::cout << *str;
*str++;
}
std::cout << std::endl;
return 0;
}
')
{
if (*str == '.')
{
*str++;
std::cout << std::endl;
}
std::cout << *str;
*str++;
}
std::cout << std::endl;
return 0;
}
Ce code imprime 192, 168, 0 et 1 à chaque octet dans une nouvelle ligne. Maintenant j'ai besoin de chaque octet dans un seul char, comme le char byte1, byte2, octet 3 et byte4 où byte1 contient 1 et byte4 contient 192... ou dans une struct IP_ADDR et de retour que struct ensuite, mais je ne sais pas comment le faire en C. 🙁
Ce code n'a pas l'impression de "octets" avec les valeurs
Oh ... juste rendu compte de ce que l'utilisateur l'a demandé. En regardant le code avec les couts, je pensais qu'il voulait juste de l'imprimer. Il veut vraiment que les octets
Ajoutant explicitement \0 à la fin d'une chaîne de caractères littérale est très étrange. En initialisant char *a = "foo\0", vous faites un littéral de chaîne avec 5 caractères à deux octets nul à la fin.
192
...: imprime des caractères ... 3 caractères pour 1
9
2
...Oh ... juste rendu compte de ce que l'utilisateur l'a demandé. En regardant le code avec les couts, je pensais qu'il voulait juste de l'imprimer. Il veut vraiment que les octets
Ajoutant explicitement \0 à la fin d'une chaîne de caractères littérale est très étrange. En initialisant char *a = "foo\0", vous faites un littéral de chaîne avec 5 caractères à deux octets nul à la fin.
OriginalL'auteur BETSCH | 2012-02-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire caractère par caractère, comme le fait la version C++ dans votre question.
*= 10
et+= *str - '0'
fait! 😛L'initialisation (
unsigned char value[4] = {0};
) est important. Ne pas l'oublier.Ce code va échouer sur certains mal formé des chaînes: "aaaaaaaaa", "999999999", "999.99999.500 AAABBBCCCDDEE.399", etc...
OriginalL'auteur pmg
ou
Pourquoi ne voyez-vous pas qui de la fonction à l'intérieur de la chaîne.h en-tête de la bibliothèque C standard sont pris en charge par le microcontrôleur pic avec qui vous travaillez en premier et ensuite nous dire? Les deux sscanf et strtok (perreal et ma réponse, respectivement) sont des fonctions de la bibliothèque c standard. Nous devons savoir combien il est disponible pour vous
Theres la bibliothèque: lien et désolé, je suis nouveau sur stackoverflow, pensée, parce que j'ai marqué avec pic18 et c18 vous les gars savent que la lib, mais ensuite j'ai réalisé que je étiquetée avec C
page 131 de l'pdf liées strtok, strtokpgm, strtokpgmram, strtokrampgm sont pris en charge. Donc, ma réponse peut être utilisé. Avez-vous le vérifier? (c'est le 3ème)
sscanf est connu pour être lent, et dans certaines implémentations de même buggy. Vous devriez éviter de l'utiliser.
OriginalL'auteur perreal
une belle façon de le faire en C, c'est d'utiliser la chaîne de caractères générateur de jetons. Dans l'exemple de code ci-dessous les octets sont enregistrés dans le tableau d'octets et sont également imprimés avec la fonction printf. Espérons que cela aide
= malloc(10);
donc seulementchar* buff;
reste. Si je n'ai pas de commentaire, je reçois un message d'erreur "invalid conversion de void* en char*", tyvmIl NE fonctionne PAS de la manière que vous pensez que cela fonctionne. C'est une erreur de jouer avec non alloué des pointeurs. Si vous obtenez cette erreur, il signifie que vous êtes de la compilation du code C++ et pas en C code. Assurez-vous que: 1) Soit de corriger le compilateur les drapeaux d'2) dans le Cas de C++ que vous voulez il suffit de changer la ligne: char* buff = (char*) malloc(10);
OriginalL'auteur Lefteris
J'aimerais fournir plus stricte de la version pour l'analyse d'adresse ipv4
OriginalL'auteur puchu