Newsgroup: it.comp.lang.c
Titolo: Problema con puntatori

Salve a tutti, ho un problema molto comune, nell'uso dei puntatori:
Premetto che sto utilizzando GCC su Linux
Sto cercando di utilizare la funzione gethostbyname la quale torna un
puntatore ad una struttura hostent
struct hostent {
    char *h_name;
    ................
    char **h_addr_list;
}
Ho dichiarato una variabile di tipo puntatore a hostent:
struct hostent *h;
Poi chiamo la funzione
h=gethostbyname(nomehost);
Poi stampo il risultato:
printf("Host= %s \n", h->h_name);
printf("IP= %s \n", h->h_addr_list[0]);
la prima stampa avviene correttamente mentre per la seconda non c'è
verso!!!!
Qualcuno mi sa indicare dove sbaglio?
grazie a tutti
CIAO
--
Toglere #NOSPAM# dall'indirizzo
Cut #NOSPAM# to replay

 Qualcuno mi sa indicare dove sbaglio?
il fatto e' che il numero di IP non e' memorizzato come una stringa
tipo "192.42.22.12" ma sono proprio i 4 bytes.
cioe' dovresti stampare qualcosa del tipo
printf("IP = ");
for (i=0; i<4; i++)
   printf("%u ",(unsigned int)(unsigned char)h->h_addr_list[0][i]);
printf("\n");
Scusa il doppio cast (unsigned int)(unsigned char) ma al momento
ho fretta e non riesco a ricordarmi il modo piu' veloce e portabile
per stampare un unsigned char nel range 0-255.
ciao,
g.

 printf("\n");
Grande!!! Funzia :-)
Pero' adesso ho seri problemi coi puntatori (sono arrugginito col C)
per usare la strcat devo dichiarare 2 variabili char *
però la strcat non funziona con stringhe non inizializzate col \0
se dichiaro due vettori in questo modo:  char pippo[10]
funziona tutto ma se non riempio tutti i 10 posti di pippo il resto contiene
strani caratteri...
(anche se metto il \0)
Qualche consiglio?
Grazie ancora!!!

 Qualche consiglio?
Ho paura di non capire esattamente quale e' il problema.
Se tu hai una stringa
char pippo[10];
questo array rappresenta una stringa lunga al massimo 9 caratteri
(perche' ci deve comunque essere uno 0 in fondo).
Se vuoi "azzerare" una stringa devi solo mettere il
primo carattere a 0.
tipo pippo[0]=0;
che fa si che pippo sia una stringa
nulla (di lunghezza 0, perche' non ci sono caratteri
che precedono lo 0).
Alternativamente puoi inizializzarla con
strcpy(pippo,"");
che ha lo stesso effetto.
i caratteri che compaiono dopo lo 0 non hanno influenza
sulle operazioni strcpy, strcat, strchr, etc.etc.
perche' queste hanno come prerequisito di operare su
stringhe terminate da 0. Quindi anche se c'e' del
garbage non ha importanza. Il problema
e' se tu dichiari una variabile tipo
char bip[3];
e poi fai qualcosa del tipo
strcpy(bip,"abc"); perche' la stringa
"abc" in realta' e' lunga 4 caratteri e quindi
"sfori" lo spazio allocato per bip (3 bytes).
Altro errore e' se poni
strcpy(bip,"ab"); // giusta fin qui
strcat(bip,"c"); //errore perche' sfori
Altro errore
bip[0]='a';
bip[1]='b';
bip[2]='c'; // corretto perche' memorizzo 3 char in un array [3].
strcpy(buf,bip); // sbagliato, perche' siccome bip non e'
//0-terminato chi sa cosa vado a copiare in buf (magari 1 mega...)
Naturalmente se tu dichiari
char *s;
allora devi ricordarti di allocare memoria, tipo
s=malloc(11);
prima di fare qualcosa tipo strcpy(s,"ciao");
etc.etc
Scusa, se mi fai capire meglio posso essere piu' specifico.
g.

 g.
Anzitutto grazie 1000 per il prezioso aiuto :-)
Quello che mi dici nella mail credevo di averlo chiaro in mente ma dato che
il programma non mi funziona vuol dire che mi sfugge qualcosa...
Sintetizzo meglio il mio problema:
Dichiaro 2 vettori:
char temp[16];
char temp2[4];
All'interno di un ciclo di 4 volte, chiamo la funzione che estrae il numero
dell'indirizzo IP (che può essere al max di 3 caratteri) e inserisco i dati
in temp2
Funziona xchè poi visualizzo a video con: printf("\n tmp2 = %s", temp2);
e visualizzo il numero corretto.
assegno tmp2 a temp (perchè devo memorizzare tutti e 4 i numeri dell'IP) con
l'istruzione:
strcat(temp, temp2);
Uscito dal ciclo stampo temp con:
printf("TEMP= %s \n", temp);
e mi torna qualcosa del tipo:
 ¸d¸d÷ÿ¿85522144
i primi caratteri non ci dovrebbero essere?!?!
Grazie ancora

 i primi caratteri non ci dovrebbero essere?!?!
...mi rispondo da solo ...a qualcuno potrebbe interessare la soluzione
Dopo innumerevoli prove e perdite di tempo ho scoperto che bastava fare:
temp[0]='\0';
Prima di entrare nel ciclo
Eppure lo sapevo che strcat non funziona con stringhe senza terminatore!!!
Grazie 1000 per l'aiuto :-)
Ciao

 i primi caratteri non ci dovrebbero essere?!?!
Devi inizializzare temp con
strcpy(temp,""); oppure
temp[0]=0;
dopo puoi fare un strcat dopo l'altro.
Altrimenti se c'e' del pattume in temp la strcat
accoda al pattume (e se il pattume non contiene degli 0 puoi
avere un bel segmentation fault...).
(PS. ma mettere anche un strcat(temp,"."); per
discriminare tra 121.12.4.55 e 12.112.45.5  ?)
ciao,
g.