Newsgroup: it.comp.lang.c
Titolo: separare frasi da linee lete da fgets

Salve.
Non riesco a capire come possa fare per separare delle parole che sono su un
unica riga restituita da fgets.
Mi spiego meglio:
Ho un file strutturato in questo modo:
nome cognome eta' numtelefono
**** ******* ** ********
**** ****** ** *********
**** ****** ** *********
**** ****** ** *********
Tramite fgets mi leggo una riga, dopodiche' dovrei memorizzare questi dati
in degli array, cioe' in uno il nome, in un altro il cognome e cosi via.
Non riesco a trovare una soluzione per estrapolare le frasi dall'intera
riga.
Qualcuno puo' darmi qualche idea.
Questo e' un esercizio che mi sono inventato io per imparare a programmare
in c.
Grazie a tutto il news.      Ciao

 sono su un unica riga restituita da fgets.
usa sscanf()
-- 
-=[]=---iAN CooG---=[]=-
"Non ti fidare di chi ti da consigli e poi ti insulta, stronzo!"

 wrote in message
news:pB3ga.49028$
Lr4.1...@twister2.libero.it

La soluzione faclie ti e' stata suggerita, quella (piu') difficile
sfrutta il separatore.
Se il separatore e' lo spazio, usi due puntatori
char* startP;
char* endP
Fai puntare startP ed endP all'inizio della riga, poi
usi 
endP = strchr(startP, ' ');
per trovare il primo separatore.
copi tutto quello che si trova tra endP e startP con
strncpy(tmpStrP, startP, endP - startP);
(tmpStrP e' un blocco di memoria allocato con calloc o malloc
di dimensione endP - startP +1)
sposti startP e lo fai diventare pari a endP +1.
La soluzione proposta ha qualche problema (tipo se c'e' piu' di un
carattere spazio non funziona), ma stai imparando a programmare o
sbaglio? :-)
C:\>iao Angelo.
P.S. Per quanto possa sembrare primitiva, e' la soluzione che usa
     il sottoscritto per questo tipo di problemi. Questo gli consente
     di controllare molto attentamente quanto scritto nel file dagli
     utenti. La scanf() non l'ha mai neanche presa in considerazione.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 unica riga restituita da fgets.
Se sono veramente delle parole allora basta utilizzare la sscanf().
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

La sscanf() va bene, ma comunque è una funzione concepita per moltissimi
utilizzi, quindi onerosa in termini di spazio e "lentezza"...
Personalmente ti consiglio di usare le funzioni per le stringhe, strtok() è
quella che fa per te presente in string.h
char *nome, *cognome;
nome = strtok(line_input, " "); // restituisce dall'inizio sino allo spazio
if (nome == NULL)
   printf("Il campo nome è vuoto!");
cognome = strtok(NULL, " "); // continua dalla pos corrente sino ad un altro
spazio
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 quella che fa per te presente in string.h
Posso condividere alcune riserve su sscanf() ma mi pare che con la
strtok() si cada dalla padella nella brace.


Ok sscanf fa per me grazie.
Pero' adesso sorge un problema:
sscanf(buffer,"%s%s%d%d",p_contr->lstname,p_contr->frtname,p_contr->t_pag,p_
contr->t_dov);
Con gli array non c'e' problema mentre con gli int non va.
cp_contr->t_pag e p_contr->t_dov  sono due interi quindi sscanf come scanf
vuole l'indirizzo di memoria, altrimenti il compilatore mi ritorna un errore
di violazione d'accesso all'indirizzo.......
Come posso fare?
Grazie.


Passa loro l'indirizzo:
sscanf(buffer,"%s%s%d%d",p_contr->lstname,p_contr->frtname,&p_contr->t_pag,&p_contr->t_dov);
