PDA

View Full Version : [c] files[a] = *buffer; xké nn va????


$te
26-08-2006, 12:37
if ((f = fopen ("files.txt", "r")) == NULL)
return 0; /* Errore */

while(fgets (buffer, sizeof (buffer), f)!=NULL)
{
if(( p = strchr(buffer,'\n'))!=NULL)
*p='\0';

a++;

files[a] = *buffer;

printf("%s",files[a]);


}

pero nn funziona!!! come mai??? nel file files.txt cé scritto:

casa
lavoro

non é la prima volta ke mi imbatto in questo problema: cioé d assegnare all'array una stringa con un puntatore....sicuro é una cagata...ma nn capisco... :muro: :confused:

Barbalbero
26-08-2006, 14:08
In che senso non funziona? quali sono i sintomi che ti portano ad una tale conclusione?

Barbalbero
26-08-2006, 14:15
Inoltre avrei bisogno di conoscere le dichiarazioni di
p
files
buffer
potrebbero essere sottintese, lo so...ma magari l'errore è lì...

$te
27-08-2006, 22:26
char *p, buffer[100],files[100];

il compilatore nn mi da errrori (uso devc) ma qnd avvio il programmino si blocca...e si kiude per errore

wisher
27-08-2006, 22:42
dichiara p non come puntatore ma come array di char.
In questo modo allochi memoria non solo per il puntatore ma per tutta la stringa

$te
27-08-2006, 23:50
ma dici ke é questo il problema? xké p deve essere un puntatore per poter fare:

if(( p = strchr(buffer,'\n'))!=NULL)

*p='\0';

xké se no mi dice ke cl un errore di compatibilità

andbin
28-08-2006, 07:59
La variabile p deve essere un puntatore e su questo non ci sono dubbi!

Poi comunque non è molto chiaro cosa vuole fare $te. Lui dice che ha dichiarato:
char *p, buffer[100],files[100];
Sui primi 2 ok, non ci sono dubbi, il terzo (files) .... dipende da cosa vuole fare $te.

Si vuole ottenere che files contenga una copia del contenuto di buffer??? Oppure si vuole che ci sia un array di puntatori tale che files[0] punti a "casa" e files[1] punti a "lavoro", ecc... per le altre eventuali righe???

Il problema è tutto lì: capire cosa si vuole ottenere! ;)

$te
28-08-2006, 13:05
grande!!"hai capito!!! é proprio quello.....files[0] punterà a casa e files[1] a lavoro!!! hehe....problema mio a spiegarmi allora,scusate

andbin
28-08-2006, 13:29
é proprio quello.....files[0] punterà a casa e files[1] a lavoro!!!Allora il tuo codice non va bene.
Di buffer (quello che usi per la fgets) ne hai 1 solo e viene sovrascritto ad ogni lettura di riga (ovviamente).

Quindi per prima cosa dichiari, per esempio:
char *linee[20];

Questo è un array di 20 puntatori. Ognuno di questi 20 puntatori può puntare ad una stringa.

Poi, dopo che hai letto la riga (e tolto quel rompiscatole ;) di \n), devi calcolare la lunghezza della riga (usa strlen), poi devi allocare della memoria (usa malloc) in modo da avere una area di memoria dove copiare la stringa.
Nota che l'area di memoria deve essere lunga strlen(riga)+1, perché c'è anche il carattere nullo.
A quel punto assegni a linee[i] il puntatore all'area allocata, dopo aver ovviamente copiato la stringa nell'area.

Tutto chiaro??

$te
29-08-2006, 08:18
allora...io o da quel che ho capito ho fatto cosi:

while(fgets (buffer, sizeof (buffer), f)!=NULL)
{
if((p = strchr(buffer,'\n'))!=NULL)
*p='\0';

len = strlen (buffer);

linee[a] = malloc(len + 1);

linee[a] = buffer;

a++;

}

il problema che in linee[0] e linee[1] cé la stringa lavoro,come mai? dovrebbe invece essere linee[0] = casa, lenee[1] = lavoro, e invece viene sovrascritto sulla prima,come mai? forse nn ho capito le ultime cose ke mi hai detto...

andbin
29-08-2006, 08:33
linee[a] = buffer;Noo! così copi solo il puntatore al buffer (la malloc quindi così non servirebbe a niente).

Devi fare:
strcpy (linee[a], buffer);

Barbalbero
29-08-2006, 09:34
Un array altro non è che il puntatore alla prima cella di una serie allocata.
...mi pare che tutte le operazioni che fai su *p le puoi fare anche su p[]


...comunque in questo caso non ne vedo l'utilità

Marco Giunio Silano
29-08-2006, 09:49
Un array altro non è che il puntatore alla prima cella di una serie allocata.
...mi pare che tutte le operazioni che fai su *p le puoi fare anche su p[]


...comunque in questo caso non ne vedo l'utilità

Sì, ma

linee[a] = buffer
linee[a] = buffer[0] <-> linee[a] = *buffer

sono un po' differenti

e poi, se ho capito bene, lui vuole copiare la stringa da un'altra parte, non avere il collegamento all'indirizzo della stringa sorgente. Quindi deve fare come dice Andbin

andbin
29-08-2006, 09:53
linee[a] = bufferQuesto sarebbe tecnicamente ok (un puntatore assegnato ad una variabile puntatore).
Ma non è quello che serve a $te.

linee[a] = buffer[0] <-> linee[a] = *bufferQueste non vanno bene (darebbero warning): buffer[0] oppure *buffer è 1 carattere, che quindi non è assegnabile ad una variabile puntatore.
;)

Barbalbero
29-08-2006, 09:57
Sì, ma

linee[a] = buffer
linee[a] = buffer[0] <-> linee[a] = *buffer

sono un po' differenti

e poi, se ho capito bene, lui vuole copiare la stringa da un'altra parte, non avere il collegamento all'indirizzo della stringa sorgente. Quindi deve fare come dice Andbin

:mbe: Ovviamente devi capire cosa stai facendo e sapere quello che dici...

io intendo che puoi fare così:
char *p;
char array[20];
...
//una volta allocato lo spazio per p
array[a]=p[a];

Quello che dici tu non c'entra molto...
Inoltre non ho detto che in questo caso va usato. Ho solamente discusso su questo punto:

La variabile p deve essere un puntatore e su questo non ci sono dubbi!

Marco Giunio Silano
29-08-2006, 09:59
Questo sarebbe tecnicamente ok (un puntatore assegnato ad una variabile puntatore).
Ma non è quello che serve a $te.

Queste non vanno bene (darebbero warning): buffer[0] oppure *buffer è 1 carattere, che quindi non è assegnabile ad una variabile puntatore.
;)

:uh: ho letto solo gli ultimi due post dando per scontato che linee fosse un buffer di buffer (linee[...][...]) e che volesse copiare li buffer e non l'indirizzo di buffer, cosa che non ho codificato da nessuna parte, infatti avevo specificato: "e poi, se ho capito bene, lui vuole copiare la stringa da un'altra parte, non avere il collegamento all'indirizzo della stringa sorgente. Quindi deve fare come dice Andbin"

Marco Giunio Silano
29-08-2006, 10:01
:mbe: Ovviamente devi capire cosa stai facendo e sapere quello che dici...

io intendo che puoi fare così:
char *p;
char array[20];
...
//una volta allocato lo spazio per p
array[a]=p[a];

Quello che dici tu non c'entra molto...
Inoltre non ho detto che in questo caso va usato. Ho solamente discusso su questo punto:

Avete ragione, ho letto due post e mi sono intromesso senza consocere la questione... facendo confusione... :muro:

$te
30-08-2006, 10:34
cmq ho risolto il problema grazie ad andbin,grazie!!!