Newsgroup: it.comp.lang.c
Titolo: Array di char*

Ecco qua l'ennesima domanda su vettori, puntatori e simili...
Dunque, io dichiaro e inizializzo un vettore di char* cosi':
char* messaggi[] = { "Pluto", "Topolino", "Nonna Papera" };
Se voglio stampare la seconda stringa non devo fare altro che questo:
printf("%s", messaggio[1]);
Fin qua tutto chiaro. Il problema e' come fare per ottenere la
lunghezza di una delle stringhe con l'operatore sizeof().
Se faccio cosi':
sizeof(messaggio[1]);
ottengo la dimensione del puntatore, quindi 4 sulla mia macchina.
E' possibile ottenere la dimensione delle stringhe oppure no?
Grazie e tutti per gli eventuali chiarimenti.
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

E' possibile ottenere la dimensione delle stringhe oppure no?
ci stai prendendo in giro ? :)
strlen() in string.h
Spero, comunque, che ti renda conto del perche' sizeof restituisce la
dimensione del puntatore e non della stringa puntata ! :)
--
Andrea Laforgia
andrea_...@bigfoot.com

 dimensione del puntatore e non della stringa puntata ! :)
Si', tranquillo, e' che ero in preda alla disperazione e le ho provate
tutte, tranne quella di contare ogni singolo elemento del vettore da
misurare fino ad una sentinella per segnare la fine, cosa che vorrei
proprio evitare...


 lunghezza di una delle stringhe con l'operatore sizeof().
Devi utilizzare la funzione standard strlen() non l'operatore sizeof().
EMG

caso non penso che si possa usare strlen()
Perche' ?
scrivi 
strlen( vettore[1] ) 
e se 
vettore[1] = "bianco"
ottieni 6.
--
Andrea Laforgia
andrea_...@bigfoot.com

 ottieni 6.
Ma tu assegni a un int* un char*, si puo' fare? Non da' warning o
errori?


errori?
int* ???
Quello che hai scritto originariamente e' :
char* messaggi[] = { "Pluto", "Topolino", "Nonna Papera" };
cioe' un vettore di puntatori a caratteri.
Scrivere, per esempio : 
strlen( messaggi[2] ) 
e' nel pieno della legalita', visto che messaggi[2] e' un char* e
strlen accetta proprio un char*
--
Andrea Laforgia
andrea_...@bigfoot.com

 strlen() o, se questa non è applicabile, la tecnica che proponevi.
Mi rassegno :-(, anche perche' la strlen() penso che non faccia altro
che scorrere la stringa fino al '\0', in pratica quello che devo fare
io per misurare la lunghezza di un int* o simili...




Ok, fin qui ci sono, cioe', c'ero anche prima ;-) il fatto e' che se
invece non ho un char* messaggi[], che corrisponde a quello che avevo
detto inizialmente, ma un int* vettore[] (opportunamente
inizializzato), non posso piu' utilizzare strlen( vettore[1] ), ma mi
tocca contare "a mano" ogni elemento del vettore di cui voglio
misurare la lunghezza. Questo era in realta' il mio problema ed e' per
questo che mi ero "incriccato" :-), ero partito dalla lunghezza di un
char*, ma pensavo a qualcosa di piu' generale come int* o
<tipo_non_char>*


misurare la lunghezza.
Scusami tanto Luca, sono io che ho sbagliato a leggere precedentemente
il post. Hai specificato che cercavi il modo per ottenere il numero di
elementi puntati da un elemento di vettore[] e ti ho risposto che va
usato strlen(). Non e' corretto. Non si puo' fare ne' in questo modo
(ovviamente) ne' in modo manuale. Non e' cioe' possibile calcolare a
quanti elementi contigui punti un puntatore. Di regola non sarebbe
possibile neanche con i (char *), ma nel loro caso viene usato il
valore "sentinella" 0, che si puo' adottare benissimo anche nel caso
dei vettori di (int *). E' solo che in questo caso genera ambiguita'
con il numero da memorizzare !...
--
Andrea Laforgia
andrea_...@bigfoot.com

char* messaggi[] = { "Pluto", "Topolino", "Nonna Papera" };
scusate la mia ignoranza, ma visto che dal poco che ho letto ogni
parola viene considerata come un vettore di caratteri terminato da /0
com'e' possibile una dichiarazione come quella sopra? inoltre
conoscevo solo l'utilizzo di * prefisso ad un puntatore come *punt per
accedere al valore della variabile a cui fa riferimento il puntatore
Aranar
e-mail: 
ro...@geocities.com
http://www.nettaxi.com/citizens/Aranar/
   (above all VgaPlanets)
http://www.tempolibero.com/user/aranar
    (sopratutto VgaPlanets)

 accedere al valore della variabile a cui fa riferimento il puntatore
Prima di utilizzarlo, un puntatore lo devi dichiarare. E l'asterisco
serve appunto anche a dichiarare un puntatore. In generale:
T *p;
significa che p è dichiarato come puntatore al tipo T.
EMG

Ma non basta fare
len = sizeof (punt*);
ovvero chiedere la dimensione della memoria allocata e puntata da punt?
Eventualmente poi dividere per
sizeof (int)
o quello che serve?
--
Alessandro Monti

 o quello che serve?
Questo ti darebbe la dimensione di un solo elemento dell'array e non di
tutto l'array.
EMG

 tutto l'array.
Mmmm. Mi sa cha hai ragione.
Del resto se punt è "puntatore a X", sizeof (punt*) mi restituirà sizeof
(X).
Che pollo :-)
--
Alessandro Monti

(X).
No, se punt e' "puntatore a X" sizeof( punt * ) ti da' sizeof(
puntatore a puntatore a X ) che molto probabilmente coincide con
sizeof( punt ), dato che sono entrambi puntatori.
Per ottenere sizeof(X) bisogna scrivere sizeof *punt o sizeof( *punt
).
--
Andrea Laforgia
andrea_...@bigfoot.com

 Che pollo :-)
<BASTARD ON>
Più di quel che credi 8-P
<BASTARD OFF>
Devi scrivere '*punt' (e non 'punt*') per dereferenziare un puntatore.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

significa che p è dichiarato come puntatore al tipo T.
ma di solito l'asterisco si usa come prefisso, e' possibile usarlo
anche come postfisso? qual'e' la differenza?


>Devi scrivere '*punt' (e non 'punt*') per dereferenziare un puntatore.
Vabbè, ho sbagliato, non c'è bosogno di attivare la modalità "bastard" :-)
Del resto il C è bello perchè puoi piantarci dentro una marea di errori, no?
:-)
--
Alessandro Monti

anche come postfisso? qual'e' la differenza?
Non si puo' usare come postfisso.
Quando lo vedi come postfisso, o meglio, ti sembra postfisso, stai
solo confondendo la dichiarazione.
In pratica, scrivere :
char * p ;
puo' signifcare definire :
char *p ;
Cioe' la quantita' *p e' un char e quindi p e' un puntatore a char.
--
Andrea Laforgia
andrea_...@bigfoot.com

Del resto il C č bello perchč puoi piantarci dentro una marea di errori, no?
Eh gia' :) peccato che poi i programmi non funzionino ! ;))
--
Andrea Laforgia
andrea_...@bigfoot.com

 Eh gia' :) peccato che poi i programmi non funzionino ! ;))
Il piů delle volte perň, li trovi in commercio :-)
--
Alessandro Monti

 anche come postfisso? qual'e' la differenza?
Esistono, come per altri simboli, diversi utilizzi, in C,
dell'asterisco. Nelle dichiarazioni deve solo essere messo tra il tipo e
il nome della variabile:
T* p;
e T *p;
è la stessa cosa. Ma tieni presente anche:
T *p, *q;
e non
T* p, q;
o
T *p, q;
con la quale dichiareresti un puntatore p e una variabile q non
puntatore. Poi si usa come operatore di dereferenza:
int *p;
...
printf( "%d\n", *p );
per "estrarre" da p il valore da esso puntato. Infine si usa anche come
operatore aritmetico di moltiplicazione.
EMG