2010-05-18 9 views
3

Je pense que ce code et cette erreur s'expliquent d'eux-mêmes, mais je ne sais pas pourquoi?

Environnement:
OS: Mac OS X 10.6.1
compilateur: i686-apple-darwin10-gcc-4.2.1

Code:avertissement: le format '% s' attend le type 'char *', mais l'argument 2 a le type 'int'

1 #include <stdio.h> 
2 #include <stdlib.h> 
3 #include <netdb.h> 
4 #include <sys/socket.h> 
5 
6 int 
7 main(int argc, char **argv) 
8 { 
9  char   *ptr, **pptr; 
10  struct hostent *hptr; 
11  char   str[32]; 
12 
13  //ptr = argv[1]; 
14  ptr = "www.google.com"; 
15 
16  if ((hptr = gethostbyname(ptr)) == NULL) { 
17   printf("gethostbyname error for host:%s\n", ptr); 
18 
19  } 
20  printf("official hostname:%s\n", hptr->h_name); 
21 
22  for (pptr = hptr->h_aliases; *pptr != NULL; pptr++) 
23   printf(" alias:%s\n", *pptr); 
24 
25  switch (hptr->h_addrtype) { 
26  case AF_INET: 
27  case AF_INET6: 
28   pptr = hptr->h_addr_list; 
29 
30   for (; *pptr != NULL; pptr++) 
31    printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); 
32   break; 
33  default: 
34   printf("unknown address type\n"); 
35   break; 
36  } 
37  return 0; 
38 } 


compilateur et sortie exécutée ci-dessous: Pourquoi est-ce que j'obtiens l'avertissement de format et est-ce que ceci pourrait être la cause de l'erreur de segmentation?

Répondre

11
  1. Veuillez compiler votre code en utilisant -Wall.
  2. inclure le fichier d'en-tête pour inet_ntop (arpa/inet.h)
  3. lire la page de manuel inet_ntop (3) et faire attention aux types de paramètres.
+0

+ 1 réponse très rapide. – Jack

+0

Cela fonctionne. Merci beaucoup. – ufengzh

5

Si je compte bien, l'avertissement est émis pour cette ligne:

printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); 

Selon this page, inet_ntop ne revient en effet char*. Cependant, apparemment, vous n'incluez pas <arpa/inet.h> - cela peut provoquer cet avertissement, car le compilateur peut par défaut interpréter une fonction non déclarée comme renvoyant un int.

La prochaine fois, veuillez marquer la (les) ligne (s) de codes problématique (s) par exemple. un commentaire - cela augmenterait vos chances d'obtenir des réponses utiles :-)

+0

"le compilateur peut par défaut interpréter une fonction non déclarée comme retournant un int." Vous avez raison, c'est le point. Et merci pour vos conseils. – ufengzh