Newsgroup: it.comp.lang.c
Titolo: niubbo, fgets & stdin

Ciao!
iniziando con la programmazione e il "c" mi sono imbattuto nei in
puts&gets: ho visto che gcc ritiene pericoloso l'uso di gets e spulciando
vecchi post ho capito perché e come modificare inserendo fgets ma qui
arrivano le domande:
- nel programmino stupido qui sotto (sono agli inizi) se immetto nel primo
testo + di 40 caratteri non va in seg fault (se uso gets si) xò assegna in
automatico i caratteri in più al II testo senza + permettermi di toccarli:
1) Come faccio a semplicemente dirgli di NON considerare i caratteri in
più?
2) A che serve e cos'è l'opzione stdin che sui manuali ogni tanto compare
in modo misterioso?
        puts("\nScrivi un testo di max 40 caratteri anche CON spazi:\n");
	fgets(testo,40,stdin);
	fflush(stdin);
        puts("\n\nScrivi un altro testo di max 40 caratteri anche CON spazi:\n");
	fgets(testo2,40,stdin);
	printf("\nScrivo adesso il PRIMO testo interamente:\n");
	puts(testo);
	printf("\n\nScrivo il SECONDO testo dal 10° carattere:\n");
	puts(&testo2[9]);
Grazie a tutti e scusate se la domanda è banale e/o il post troppo
lungo!!!
-- 
*--------------------*----------*--------------------*
         ***** Powered by linux Mandrake 9.1 *****
     Linux Registered User #311305# ICQ: 27313589

 	fflush(stdin);
Questa istruzione e' da evitare. Su Linux dovrebbe dare come errore
EBADF. Forse e' questo che incasina il programma.
HTH
C:\>iao Angelo

 EBADF. Forse e' questo che incasina il programma.
infatti si era gia' detto ingiro in qualche post che fare il flush dello
standard input e' UNDEFINIED BEHAVIOR e quindi sconsigliatissimo.
speriamo che con questo risolvi ciao

 C:\>iao Angelo
grazie infinite!!!
-- 
*--------------------*----------*--------------------*
   per rispondere elimina lospam dall'indirizzo!!!


 	puts(&testo2[9]);
Quando immetti i caratteri da tastiera, questi finiscono in un
buffer di input fornito dal S.O. da cui fgets() va a leggere. Se
immetti piu' caratteri di quelli che fgets() preleva, quelli non
prelevati restano in questo buffer e vengono prelevati alla
successiva fgets().
Per questo motivo ti trovi "caratteri strani" nel secondo buffer:
in realta' sono i caratteri non letti la volta precedente. Puoi
renderti conto di questo comportamento scrivendo una frase sensata
piu' lunga del buffer o usare un buffer piu' piccolo.
Se fflush(stdin) svuotasse il buffer di input, avresti risolto il tuo
problema... Peccato che fflush(stdin) sia undefined behaviour e venga
implementata con comportamenti diversi da produttori diversi.
Prima di passare alla seconda lettura devi svuotare il buffer di input,
per fare questo puoi mettere la fgets() in un ciclo e verificare se e'
stato letto il carattere '\n'. A questo punto il buffer e' stato
svuotato dai caratteri immessi la prima volta e puoi passare al nuovo
input.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG



Grazie sei stato molto chiaro!!
ora provo la modifica!!!
-- 
*--------------------*----------*--------------------*


 input.
grazie ancora ho risolto inserendo una riga con:
 
while (getchar()!='\n');
dopo il primo fgets e adesso è tutto ok!!!
grazie!
-- 
*--------------------*----------*--------------------*
