PDA

Visualizza la versione completa : [C] Pulire buffer dopo l'input


PeppePes88
31-10-2008, 14:19
ciao...
Ho questo problema, vorrei prendere in input una stringa di n caratteri tramite la chiamata a read, ma se inserisco una stringa piu lunga i primi n caratteri vengono salvati nel mio buffer, mentre i restanti rimangono nel file stdin, quindi vengono presi dalla successiva chiamata di input.... Io vorrei eliminare questi!! Ho provato con la chiamata a lseek posizionando l'offset alla fine del file ma non funziona.... Suggerimenti????

:confused: :confused: :confused: :confused:

menphisx
31-10-2008, 21:14
Semplicemente dopo aver preso l'input, fai una cosa del genere:


while(getchar() != '\n');


Così svuoti il buffer.
Ovviamente ci deve essere un carattere terminatore di stringa, come newline o NIL.

:ciauz:

PeppePes88
31-10-2008, 21:38
il codice che hai scrito tu prende in input n caratteri finche non entra in input il carattere newline... Ma il mio problema e se in una chiamata si eccede la grandezza passata alla funzione, in quanto quei valori rimangono nel file!!!

es :


char buffer[10];
read(0, buffer, 10); // 0 STDIN

// se qui inserisco una stringa piu lunga di 10 i valori succesivi alla posizione 10 rimangono
// nel file e sono quelli che voglio eliminare

// mia soluzione spostare l'offset alla fine ma non funge

lseek(0, 0, END); // non ricorso il flag che manda alla fine



Ma non funge... L'offeset rimane sempre nella stessa soluzione!

menphisx
31-10-2008, 22:07
È sbagliato, END non esiste; leggi qua (http://www.opengroup.org/onlinepubs/000095399/functions/lseek.html) :stordita:

Samuele_70
31-10-2008, 22:29
Con la lseek non credo che funzioni.
Puoi crearti una funzione tipo



int leggiStringa( char *str, int maxLen)
{
int len;
char ch[2];
read(0, str, maxLen-1); // 0 STDIN
len = strlen(str);
if( str[len]!='\n' )
while( read(0, ch, 1), ch[0]!='\n');
str[len]=0;
return len;
}

Nella dichiarazione della stringa non hai previsto lo spazio per il terminatore :nonono:

PeppePes88
31-10-2008, 22:46
non capisco il senso di questo



if( str[len]!='\n' )
while( read(0, ch, 1), ch[0]!='\n');
str[len]=0;


ma perchè non funziona con la lseek?

Samuele_70
31-10-2008, 23:15
Originariamente inviato da PeppePes88
non capisco il senso di questo



if( str[len]!='\n' )
while( read(0, ch, 1), ch[0]!='\n');
str[len]=0;




Se l'ultimo carattere della strnga non è il valore del tasto di invio,
estrae tutti i caratteri in stdin, finchè non lo trova.

MItaly
31-10-2008, 23:48
In molte implementazioni della libreria C fflush(stdin) pulisce il buffer di input (ma tieni conto che non è un comportamento richiesto dallo standard, per cui con alcuni compilatori potrebbe non funzionare).

Samuele_70
31-10-2008, 23:58
In effetti la fflush() è dedicata solo a stream su file.
Io non la userei con lo stdin, anche se di solito funziona. :)

PeppePes88
01-11-2008, 01:54
Ok!!! Ho capito tutto... Ma rimango perplesso dal fato che la lseek non funzioni!!! Non l'avrebbe dovuto fare lei l'aggiornamento dell'offset senza bisogno del ciclo?? O forse capito male il funzionamento e l'utilità della lseek.....

Loading