Newsgroup: it.comp.lang.c
Titolo: Problema controllo lunghezza stringa acquisita mediante fgets()

Ho un piccolissimo problema con questa funzione :
printf("Campo -->> ");
	fgets(str_buff, LCAMPO+2, stdin);
	if(strlen(str_buff) > LCAMPO) {
		printf("La stringa inserita potrebbe aver subito troncamento
[Dimensione massima:%d]\n", LCAMPO);
		strncat(res, str_buff, LCAMPO);
		while(flush != '\n')		/*Svuota il buffer da tastiera*/
			flush = getchar();
	}
	else
		strncat(res, str_buff, strlen(str_buff)-1);
Qualora si inserisca una stringa di esattamente LCAMPO caratteri, la
fgets() richiede un ulteriore invio. Ciò non accade se vengono
inseriti più o meno caratteri di LCAMPO.
Qualcuno sa aiutarmi????
Grazie
Ciao
Ste

 ha scritto nel messaggio 
news:1120581678.8...@g43g2000cwa.googlegroups.com...
Ho un piccolissimo problema con questa funzione :
printf("Campo -->> ");
fgets(str_buff, LCAMPO+2, stdin);
if(strlen(str_buff) > LCAMPO) {
printf("La stringa inserita potrebbe aver subito troncamento
[Dimensione massima:%d]\n", LCAMPO);
strncat(res, str_buff, LCAMPO);
while(flush != '\n') /*Svuota il buffer da tastiera*/
flush = getchar();
}
else
strncat(res, str_buff, strlen(str_buff)-1);
Qualora si inserisca una stringa di esattamente LCAMPO caratteri, la
fgets() richiede un ulteriore invio. Ciň non accade se vengono
inseriti piů o meno caratteri di LCAMPO.


flush svuota il buffer da tastiera (ho letto su internet che la fflsuh
può dare dei problemi). res è una stringa utilizzata per una
concatenazione.

 Per svuotarlo usa la funzione fflush(stdin) è fatta apposta :)
Come Andrea LaForgia ha fatto piu` volte notare, il comportamento
della fflush() sugli stream di input e` indefinito.
Per svuotare un buffer di input bisogna leggere e scartare
caratteri finche' non si arriva all'EOF.
Saluti,
Marco
-- 
To email me, remove the no_ and _spam from my address.

 ha scritto nel messaggio 
news:1120582960.4...@g49g2000cwa.googlegroups.com...


Con la fflush funziona con  LCAMPO caratteri, peccato che non funzioni
con più di LCAMPO caratteri :)

 ha scritto nel messaggio 
news:1120583869.7...@z14g2000cwz.googlegroups.com...


Ho provato come mi hai detto, ma purtroppo non funziona...è sempre
necessario un altro ritorno carrello... :(

 Qualcuno sa aiutarmi????
E` sbagliato il confronto con la lunghezza della stringa. Tu dici a
fgets che ha a disposizione LCAMPO + 2 caratteri (il buffer e`
dimensionato correttamente, vero?); di conseguenza gets leggera` al
massimo LCAMPO + 1 caratteri per lasciare il posto per il terminatore di
stringa.
Se inserisci una stringa di LCAMPO caratteri e poi premi invio fgets
consumera` tutto l'input a disposizione visto che puo` leggere fino a
LCAMPO + 1 caratteri. Visto che il buffer di input e` vuoto la
secessiva getchar() si blocchera` in attesa.
In base alla semantica che LCAMPO ha nel tuo programma potresti voler
cambiare il suo valore tenendo conto di quanto detto sopra ed aggiustare
la fgets oppure cambiare la condizione dell'if:
        if (strlen(str_buf) > LCAMPO + 1) {
                /* La stringa e` stata troncata, tolgo tutto quello che
                 * e` rimasto nel buffer.
                 */
                 printf(...);
                 strncat(...);
                 while(getchar() != '\n')
                        /* Nothing */;
        } else {
                ....
Luca
-- 
Home: 
http://kronoz.cjb.net
"Su cio` di cui non si puo` parlare e` bene tacere".
 Ludwig Wittgenstein

 Per svuotarlo usa la funzione fflush(stdin) è fatta apposta :)
No, per l'ennesima volta. La funzione fflush() è fatta apposta per
svuotare i buffer di *output*, NON quelli di input.  Sui buffer di input
il suo comportamento è indefinito.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Qualcuno sa aiutarmi????
Se chiami fgets(str_buff, LCAMPO+2, stdin)
c'e' 3 casi: (esempio LCAMPO=7)
1) Se inserici una stringa "stringa" di al massimo 7 caratteri + ENTER
str_buf:  |s t r i n g a \n 0|
 
strlen(str_buf) = 8 
perque fgets *legge* il \n e la stringa *non* č troncata.
2) Se inserici una stringa "stringax" di 8 caratteri + ENTER
str_buf:  |s t r i n g a x 0|
 
strlen(str_buf) = 8 
fgets non *legge* il \n e la stringa *non* č troncata e la parte de la
riga non letta e' |\n|.
3) Se inserisci una stringa "stringaxy" di 9 caratteri o piu + ENTER
str_buf:  |s t r i n g a x 0|
 
strlen(str_buf) = 8 
la stringa č troncata e il resto non letto e  |y \n|
Quindi la logica di fgets 'e:
Se  str_buf[strlen(str_buf)-1] == '\n'
allora la stringa non č troncata.
Se  str_buf[strlen(str_buf)-1] != '\n'
allora la stringa potrebbe essere troncata.
  char *p;
  printf("Campo -->> ");
  fgets(str_buff, LCAMPO+2, stdin);
  if ( (p=strchr(str_buf,'\n')!=NULL )
     *p = 0;
  else {
     while (getchar()!='\n') ;
     str_buf[LCAMPO]=0;  
  }
  strcat(res, str_buf);
-- 
Horst

 Qualcuno sa aiutarmi????
Se chiami fgets(str_buff, LCAMPO+2, stdin)
c'e' 3 casi: (esempio LCAMPO=7)
1) Se inserici una stringa "stringa" di al massimo 7 caratteri + ENTER
str_buf:  |s t r i n g a \n 0|
 
strlen(str_buf) = 8 
perque fgets *legge* il \n e la stringa *non* č troncata.
2) Se inserici una stringa "stringax" di 8 caratteri + ENTER
str_buf:  |s t r i n g a x 0|
 
strlen(str_buf) = 8 
fgets non *legge* il \n e la stringa *non* č troncata e la parte de la
riga non letta e' |\n|.
3) Se inserisci una stringa "stringaxy" di 9 caratteri o piu + ENTER
str_buf:  |s t r i n g a x 0|
 
strlen(str_buf) = 8 
la stringa č troncata e il resto non letto e  |y \n|
Quindi la logica di fgets 'e:
Se  str_buf[strlen(str_buf)-1] == '\n'
allora la stringa non č troncata.
Se  str_buf[strlen(str_buf)-1] != '\n'
allora la stringa potrebbe essere troncata.
  char *p;
  printf("Campo -->> ");
  fgets(str_buff, LCAMPO+2, stdin);
  if ( (p=strchr(str_buf,'\n')!=NULL )
     *p = 0;
  else {
     while ((p=getchar())!='\n' && p!=EOF);


Ho prova con tutte le soluzioni proposte ma non sono riuscito a
risolvere il problema.. :(
1) Con la soluzione proposta da Kronos se inserisco una stringa lunga
esattamente LCAMPO effettua il troncamento ma nn riesco ad inserire il
campo dopo...
2) Con la soluzione proposta da Horst con esattamente LCAMPO caratteri
non funziona...
Qualcuno ha qualche altra idea?!?
Grazie ancora!

Ci sono
riuscito!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :D
Era un problema di indici.....grazie dell'aiuto!! ;)
Ecco il codice funzionante :
fgets(str_buff, LCAMPO+1, stdin);
	if(strlen(str_buff) >= LCAMPO) {
		while(getchar() != '\n')
		strncat(str_res, str_buff, LCAMPO);
	}
	else
		strncat(str_res, str_buff, strlen(str_buff)-1);