Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] pulire buffer dopo l'input

    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????


  2. #2
    Semplicemente dopo aver preso l'input, fai una cosa del genere:
    codice:
    while(getchar() != '\n');
    Così svuoti il buffer.
    Ovviamente ci deve essere un carattere terminatore di stringa, come newline o NIL.


  3. #3
    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 :
    codice:
    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!

  4. #4

  5. #5
    Con la lseek non credo che funzioni.
    Puoi crearti una funzione tipo

    codice:
    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
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    non capisco il senso di questo

    codice:
    if( str[len]!='\n' )
    		while( read(0, ch, 1), ch[0]!='\n');
    	str[len]=0;
    ma perchè non funziona con la lseek?

  7. #7
    Originariamente inviato da PeppePes88
    non capisco il senso di questo

    codice:
    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.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    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).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    In effetti la fflush() è dedicata solo a stream su file.
    Io non la userei con lo stdin, anche se di solito funziona.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    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.....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.