Newsgroup: it.comp.lang.c
Titolo: Array di stringhe

Salve a tutti, ho cercato di risolvere il mio problema leggendo i post
precedenti, ma non ci sono riuscito...
Ho una struttura che deve avere un array di interi e uno di stringhe.
L'ho definita cosě:
typedef struct lista{
int heapsize;
int key[50];
char *data[50];
}lista;
Ora vado a leggere da un file in cui i dati sono scritti in questo modo: i
primi 2 caratteri sono un intero + uno spazio + stringa.
Questo č il ciclo di lettura:
i=0;
while(feof(stream) == 0){
     fscanf(stream, "%d %s", &key, data);
     A->key[i] = key;
     A->data[i] = data;
     A->heapsize = i;
     i=i+1;
     }
Il problema č questo: se vado a rileggere l'array mi trovo il campo data che
riporta per ogni data[i] il valore finale letto.
Sono abbastanza certo che il problema č nella definizione del tipo, non sono
sicuro che sia char *data[50], avevo pensato a char data[50][50] (ad. es.),
ma in questo caso come si gestisce?
Grazie a tutti per l'aiuto
Marco

 ma in questo caso come si gestisce?
Fai una copia della stringa:
strcpy(A->data[i], data);
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Runtime error 6D at f000:a12f : user incompetente

 ha scritto nel messaggio
news:agcfbh$6ad$2...@dreamland.darkstar.net...


 a priori?
Si`, si puo` fare:
typedef struct lista {
        [....]
        char **data;
} lista;
lista l;
l.data = malloc(sizeof(char *) * array_size);
for (i = 0; i < dim_array; i++)
        l.data[i] = malloc(string_size);
Per liberare la memoria:
for (i = 0; i < dim_array; i++)
        free(data[i]);
free(l.data);
[cut del quote]
Quando  rispondi  ad  un  messaggio fallo  sotto  al  messaggio  stesso,
avendo  cura  di eliminare  le  parti  non  necessarie ad  una  corretta
comprensione  della  tua  risposta. Se  la  riposta  e`  particolarmente
articolata rispondi direttamente sotto alle frasi a cui indendi di volta
in volta rispondere.
Rispettare la  netiquette aumenta  le probabilita`  che qualcuno  che ti
risponda. Vedere un quoting alla CDC fa scappare molta gente...
www.albion.com/netiquette/
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il coraggio non mi manca.
E` la paura che mi frega...

 sistema operativo si arrabbia).
LOL!
Grazie mille, sono in debito!
Ciao
Marco ^__^

Come tutti sanno in C, le stringhe sono array di caratteri.
Tuttavia se io scrivo:
ary[1] = STRINGA;
con ary, cosi definito:
char * ary[10];
trovero' in ary[1] la stringa contenuta nella variabile STRINGA.
Ora, cosa e' successo?
ary[1], che era stata precedentemente allocata con malloc() , ha
cambiato *effettivamente* il valore dei caratteri puntati, o ha
cambiato l'indirizzo della stringa da puntare ?!
Tornando alla riflessione che inizia il post, e considerando che
esiste strcpy() (se c'è, un motivo ci sara'!), mi viene da pensare che
in ary[1], l'unica cosa che e' cambiata e' l'indirizzo della stringa
puntata.
Per esserne sicuro ho scritto due righe di codice, che però mi
confermano l'OPPOSTO!!!
<CODE>
#include <stdio.h>
#include <stdlib.h>
char * ary[10];
char * stringa;
int main()
{
register unsigned short i;
for(i=0;i<10;i++)
ary[i] = malloc(10*sizeof(char));
for(i=0;i<10;i++)
ary[i] = "\0";
stringa = malloc(10*sizeof(char));
stringa = "ciccio\0";
ary[1] = stringa;
printf("%9s\n",ary[1]);
stringa = "ciccione\0";
printf("%9s\n",ary[1]);
      system("PAUSE");
      return 0;
}
</CODE>
Questo programma compilato su DEV-C++ (gcc) stampa due stringhe
identiche!
Se ary[1] avesse cambiato indirizzo della stringa puntata, al
cambiamento di stringa, avrebbe dovuto stamparne una diversa.
Dunque voi che ne dite?
NM

 printf("%9s\n",ary[1]);
Ora cambi l'indirizzo di stringa che punterà ad una diversa stringa. Non
cambi invece il contenuto di ary[1] che continuerà a puntare alla stringa
precedente.
Diverso sarebbe stato il caso in cui avessi fatto:
    stringa = malloc(sizeof(char) * 10);
    strcpy(stringa, "ciccio");
    ary[1] = stringa;
    printf("%s\n", ary[1]);
    strcpy(stringa, "ciccione");
    printf("%s\n", ary[1]);
In questo modo stringa e ary[1] avrebbero continuato a puntare allo stesso
indirizzo di memoria, modificando pero` il contenuto della stringa.
Maurizio.

impossibile usare strcpy.
MMMmmm mi serviva un'inizializzazione delle stringhe ! Se provo a
leggere una stringa non inizializzata (e quindi senza \0), rischio un
errore di accesso alla memoria!
Come le posso inizializzare in alternativa?! Le stringhe inizialmente
dovrebbero essere cosi:
"" (cioe' con nessun carattere) e non cosi " "...
mumble....
Quindi come faccio a copiare il contenuto di una stringa contenuta in
una STRUCT con strcpy ? 
So che e' OT, ma ho un'altra domanda: in Visual C++ strcpy supporta
UNICODE?
ANSI C supporta UNICODE?
Grazie!
NM