2010-10-17 3 views
4

J'ai un pointeur * ip_address_server qui contient l'adresse IP du serveur:valeur de copie du pointeur char à un tableau de caractères

in_addr * address = (in_addr *)record->h_addr; 
    char *ip_address_server = inet_ntoa(* address); 

Il est clair que, quand je l'utilise printf pour imprimer la valeur de celui-ci, il obtient joliment imprimé.

printf("p address %s" , ip_address_server); 

Mais maintenant, si je déclare un tableau de dire la taille 20 pour maintenir la valeur alors je dois copier le contenu du pointeur vers le tableau.

char host_name[20]; 

Pour copier la valeur, j'ai utilisé une boucle for. Mais la valeur que j'imprime plus tard n'est pas la bonne valeur.

for(int i = 0; ip_address_server[i] != '\0'; i++) 
     host_name[i] = ip_address_server[i]; 
    printf("hostname %s \n" , host_name); 

Je pense qu'il y a une erreur avec la condition de terminaison.

Est-ce que je me trompe dans mon approche ou y a-t-il d'autres solutions pour cela?

Répondre

2

Safe & meilleure façon de le faire:

snprintf(host_name, sizeof(host_name), "%s", ip_address_server); 
+0

merci dis vraiment travaillé comme un charme – w2lame

1
    fonction au lieu de copier les valeurs octet par octet
  1. vous devez copier le caractère NULL de terminaison
  2. utilisation memcpy(), sinon vous obtenez indésirable. Cela s'applique à la fois à l'appel memcpy et à votre boucle
  3. Le nom de l'hôte peut être supérieur à 20 octets. Je ne me souviens pas de la valeur exacte pour le moment, mais j'allouerais un tableau d'au moins 100 octets. Mise à jour: Wikipédia dit "Chaque étiquette peut contenir jusqu'à 63 caractères, le nom de domaine complet ne doit pas dépasser une longueur totale de 253. [9] En pratique, certains registres de domaine peuvent avoir des limites plus courtes."
+0

'inet_ntoa' ne convertit une adresse IPv4 de la ' in_addr 'forme à la forme de chaîne 'dots-and-number', il ne fait aucune recherche DNS inverse ou autre, donc il n'a besoin que de 16 caractères. –

+0

Vous avez raison, j'ai oublié cela. –

5

Votre boucle ne copie pas l'octet '\0'. En outre, pourquoi n'utilisez-vous pas simplement strcpy (ou plus sûr strncpy) ou memcpy?

+0

Merci copie \ 0 fait cela a fonctionné. – w2lame

1

Il vous manque le caractère nul à la fin du tableau char. Votre boucle for copie tous les caractères mais pas le caractère nul. Pour corriger cela, vous devrez le copier vous-même une fois en dehors de la boucle comme:

int i; 
for(i = 0; ip_address_server[i] != '\0'; i++) 
     host_name[i] = ip_address_server[i]; 
host_name[i] = 0; // add nul char. 
printf("hostname %s \n" , host_name); 
+0

Votre exemple ne fonctionnera pas car 'i' n'est pas défini en dehors de l'instruction' for'. –

+0

@Ferdinand: Merci d'avoir choisi. – codaddict

+0

Oui, j'ai compris. merci – w2lame

Questions connexes