Newsgroup: it.comp.lang.c
Titolo: Capire meglio l'uso delle variabili e dei vettori in c.

Salve a tutti.
C'e' una cosa che non capisco in c.
Se io dichiaro questi due vettori char a[2]; char b[2]; mi aspetto di
avere riservato due zone di memoria indipendenti.
Ma allora perche' se leggendo un file di testo faccio:
fseek(f1, 2L, SEEk_CUR);
fgets(a, 3, f1);
fseek(f1, 0L, SEEK_CUR);
fgets(b, 3, f1);
printf("%s\n", a);
printf("%s\n", b);
vedo solo b come se mi avesse sovrascritto a?
Se invece faccio;
fseek........
fgets............
printf("%s\n", a);
fseek............
fgets............
printf("%s\n2, b);
vedo, logicamente tutti e due  i vettori, a conferma che sembrerebbe
che, sia per a che per b, utilizzi la stessa zona di memoria.
Come si risolve la faccenda?
Con altri linguaggi non ho mai avuto questo problema.
Grazie.
--
  Mauro Sanna
(
mrs...@tin.it
)
--
Automatic posted from 
mail.tin.it
 [194.243.154.49]
via Mailgate Server - 
http://www.mailgate.org

[...]
Tieni presente che in c le stringhe sono vetori di char terminati da un 
carattere null (\0), quindi quando fai printf("%s",a) a deve terminare con 
un null, altrimenti printf non puo' capire dove finisce. Con a[2] hai 
riservato spazio per due caratteri, ma se questa deve essere una stringa 
e' di un solo carattere, perche' l'ultimo spazio deve essere occupato da 
null. Inoltre fgets(a,3,f1) va a scrivere oltre il limite fisico del 
vettore, perche' legge si 3-1 caratteri, ma poi ci aggiunge la 
terminazione.
-- 
Warning!
Don't send any mail for me at my from: or replayto: addresses ;
I just kill the mail over there without reading!


Molte grazie ora funziona. Mi hai schiarito le idee.Pongo un'altro quesito.
Ho questa struttura : struct Record {
                                                                char anno[3];
                                                                char mese[3];
                                                                char giorno[3]; }
Dichiaro: struct Record RecTimb.
Leggo da un file ascii una stringa in questo modo fread(&RecTimb, sizeof(RecTimb), f1).
Ora mi aspetto di avere in anno un valore, in mese un valore, e cosi' via.
Cosi' e', ma se tento di visualizzare solo il contenuto di anno cosi' printf("%s\n",
RecTimb.anno);
mi viene fuori tutta la stringa letta.
Ho aggiunto la fine stringa cosi' RecTimb.anno[3] = '\0', RecTimb.mese[3] = '\0',
RecTimb.giorno[3] = '\0' ma cosi' facendo posso vedere solo anno.
Dove sbaglio?


Grazie.
Prego.



Allora non ho capito.
Intanto anche se utilizzo array[2] e nel [2] elemento inserisco '\0' non cambia niente.
Perche' nella risposta precedente mi hai indicato che era necessario che dichiarassi il vettore con tre
elementi ed ora lo devo dichiarare con due?
In anno dovrei trovare '96' in mese '01', pero' se faccio printf("%s\n", Rec.Timb.anno) e successivamente
printf("%s\n", RecTimb.mese) vedo solo l'anno.
Se faccio solo printf("%s\n", RecTimb.mese[0]) non vedo niente, o meglio, c'e' uno spazio, mentre se
faccio printf("%s\n", RecTimb.mese[1]) vedo, come mi aspetto, 1.
La riga del file di testo che sto leggendo e' cosi' composta 960101, piu' altri dati. Utilizzo la struct
per leggere la riga in un sol colpo e avere i vari elementi gia' disposti su diversi vettori.
Ripeto: '\0' ho pensato di aggiungerlo io credendo cosi' facendo di poter risolvere il problema che ti ho
gia' accennato, ma......
Ciao.


 RecTimb.giorno[3] = '\0' ma cosi' facendo posso vedere solo anno.
printf("%s %s %s\n",RecTimb.anno,RecTimb.mese,RecTimb.giorno);
o   oooooo	Gian Uberto Lauri        "So, are you working on finding
      o    o	
sa...@maya.dei.unipd.it
   that bug *now* or leaving it until
     o o				  later?" - "Yes!" 

 wrote:
Ciao Mauro,
l'array dichiaralo cosi':
	char A[3];
cosi' facendo dichiari un array di 3 elementi, questi
elementi sono:
	A[0], A[1], A[2].
In A[2] metti /0
	A[2] = '/0';
Poi: printf( "%s", A);
e ti scrivera' la stringa consecutiva di due caratteri A[0]A[1].
TheMizar - MysticPizza 

Intanto anche se utilizzo array[2] e nel [2] elemento inserisco '\0' non cambia niente.
Certo che non cambia niente...., forse non mi sono spiegato bene io. Gli 
elementi di un array in C  sono numerati a cominciare da 0, non da 1. 
Cosi' se io dichiaro un'array char a[3], riservo in memoria lo spazio per 
tre char, e gli elementi dell'array sono a[0], a[1] e a[2] . a[3] non 
esiste proprio! Quindi, se io voglio memorizzare in a una stringa, poniamo 
"XX", devo mettere a[0]='X', a[1]='X', a[2]='\0'.
E' piu' chiaro adesso??


Grazie.
Si', ora e' piu' chiaro.
Tornando al problema relativo alla struct quindi non c'e' niente da fare,
devo trovare un'altra soluzione per poter leggere delle stringhe da una riga
di un file di testo e assegnarle rispettivamente a variabili diverse che
saranno, essendo stringhe, dei vettori.
Ricordo che il problema relativo alla struct era che data questa struttura:
struct Record { char anno[2];
                          char mese [2];
                          char giorno[2];
                          char cognome[20];
                          char nome [20]; }
struct Record RecTimb;
Eseguo un'istruzione di questo tipo: fread(&RecTimb, sizeof(RecTimb), f1);
Se poi volessi vedere per esempio solo il contenuto di anno facendo
printf("%s\n", RecTimb.anno) mi viene fuori tutta la riga letta.
Grazie.
 _  _  __
|  \/  |(_/ _     _  _  _
|      |/_)(_)_|  )|  )(_)_


Ricordo che il problema relativo alla struct era che data questa struttura:
La struttura, per contenere i dati che vuoi te, deve essere dichiarata 
cosi':
struct Record {           char anno[3];
                          char mese [3];
                          char giorno[3];
                          char cognome[21];
                          char nome [21]; }
struct Record RecTimb;
Se un array deve contenere una stringa di 2 caratteri, la sua dimensione 
deve essere di 3, per via del terminatore finale.
Comunque ti consiglio la lettura di un buon testo sul C, magari proprio 
l'immancabile K & R "Il linguaggio C - seconda edizione".



Cioe'? Potresti chiarirmi questo concetto?
Ciao.
--


 Mailgate is maintained online by Dario Centofanti


> l'immancabile K & R "Il linguaggio C - seconda edizione".
Buon consiglio (e` il testo che io chiamo sempre "il
Kernighan e Ritchie", com'e` abitudine diffusa, ma
anche "il K&R" e` un suo pseudonimo popolare:-).
Alex

"Sanna" per poi scaricarle su dei campi di una tabella.
Sorry, messi cosi' non saprei proprio come fare. Ma questi dati li hai 
memorizzati te precedentemente?? Se si, perche' non metti tra un dato e 
l'altro un separatore, in genere uno spazio o un tab? Ti semplifichereste 
notevolmente la vita. Se ci fosse uno spazio in mezzo ti basterebbe 
semplicemente un fscanf(file,"%s %s %s %s %s",anno,mese,giorno,nome,cognome)
Oltretutto leggere un carattere alla volta ti puo' andare bene per i primi 
tre campi, che hanno una lunghezza fissa, e per gli altri poi come fai?? 
Quando smetti di leggere il nome ed inizi a leggere il cognome??
Comunque, se scegli di mettere un separatore tra i campi, prima di usare 
fscanf() leggi bene la documentazione a riguardo, sopratutto per quanto 
concerne i limiti da impostare per ogni variabile.
Un'altra cosa: le linee dei post sono troppo lunghe, imposta il tuo editor 
in modo da limitarle a non piu' di 70-75 caratteri, e non aggiungere ogni 
volta un Re: al subject!
