PDA

Visualizza versione completa : [C - piattafoirma Linux] Svuotare il buffer della tastiera


Dr_House
08-09-2005, 00.32.08
Con win esiste la funzione fflush(); che mi permette di cancellare il Buffer della tastiere abbastanza facilmente

in linux invece non sonosco quale sia questa funzione, di fatto dovrebbe esistere qualcosa di simile ma non c'è.

Il problema è quello di svuotare il buffer di input ogni volta che eseguo una scanf.

Potreste darmi dei suggerimenti?

Dr_House
08-09-2005, 00.38.07
Come non detto... ho avuto il colpo in testa come al solito..

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

questa subito dopo la scanf svuota il buffer e risponde allo standard ISO contrariamente a fflush();

funge sia per win che per linux, in caso il sistema usi un sistema doppio di buffer allora può creare dei problemi.

Scusate se mi faccio domande e risposte da solo...

Ciao!

Downloader
08-09-2005, 00.40.58
Scusa, conosci per caso qualche bel sito che aiuta per scrivere o per il porting di codice c da win??

Perchè avrei piacere di usare tutti i programmi che ho fatto in questi anni sotto win su linux ma ho problemi con i comandi che magari su linux non vanno e quindi va tutto a farsi benedire.

Downloader
08-09-2005, 00.41.31
Originariamente inviato da Dr_House
Scusate se mi faccio domande e risposte da solo...


Se lo fa Marzullo perchè non puoi farlo te! :D

Dr_House
08-09-2005, 00.51.13
Bella Downloader :D:D

Comunque per convertitr programi da Win a Linux non conosco nulla di specifico, posso solamente dirti che se usi lo standard ANSI ma meglio ancora lo standard ISO non dovrebbero esserci problemi.

Se poi usi delle System Call allora posso suiggerirti di guardare qualche sito dell'universitÃ_ di Roma la Sapienza.

Li ci sono ottime documentazioni sul reparto DIS su questi cambi tipo scambi di messaggi, memoria condivisa e quant'altro.

Ciao

Downloader
08-09-2005, 01.03.51
Puoi spiegarti meglio??

ISO?? ANSI?? (o meglio le conosco solo di nome) Questa è la pigrizia dell'una di notte, non mi va di spulciare :p

SkAkKo
08-09-2005, 13.56.05
guarda che la funzione fflush() è standard e fa parte delle libreria stdio.h e funziona benissimo su linux
per Downloader: quando il Linguaggio C venne creato venne nominato un comitato con lo scopo di creare uno standard ANSI (American National Standards Institute) che definisce il linguaggio C una volta per tutte. Poi successivamente questo standard venne adottato anche dall' ISO (International Standards Organization) e lo standard risultante veniva normalmente chiamato C standard ansi/iso
un altro standard usato più attinente al sistema nel suo complesso è lo standard POSIX(Portable Operating System Interface) la X finale sta nel fatto che è in stretta relazione nei sistemi Unix

Dr_House
08-09-2005, 16.02.11
fflush(); non funge su tutte le piattaforme di fatto non rientra nello standar ISO per quanto ne sappia.

Ad esempio sul mio computer non funziona (in Linux ma in win si), sul portatile dle mio amico si.
Questo dipende dalla bufferizzazione della tastiera, pertanto ho scelto una piccola scorciatoia che mi permettesse di andare più sul sicuro andando a svuotare completamnte tutto il buffer consumando i dati in esso contenuto...

SkAkKo
08-09-2005, 16.07.17
aspettiamo il parere di un altro più esperto di noi ;)

SkAkKo
08-09-2005, 16.09.18
ma cmq che significa non funziona?? ti da qualche errore di compilazione? o fila tutto liscio però poi non fa il suo dovere??

Dr_House
08-09-2005, 16.09.27
Magari fosse... poi ho un'altra domanda.. è possibile limitare il numero di caratteri digitabili nella scanf?

non mi riferisco alla selezione del tipo scanf("%c(! & $)",var) ma limitare proprio il numero di caratteri digitabili non consentendo ad esempio l'inserimento di una stringa più lunga di 2 caratteri.

SkAkKo
08-09-2005, 16.21.16
puoi usare
char stringa[2];
scanf("%2s",stringa);
però se inserisci una stringa ad esempio abcd ,scanf leggerà soltanto ab e cd rimarranno nel canale di input

Dr_House
08-09-2005, 16.29.40
fflush() produce un risultato diverso.. ovvero non mi svuota il buffer... da qui leggendo un articolo su un libro mi è venuto in mente che magari il mio S.O. dispoine la tastiera con due buffer e la fflush ne cancella solo uno! E per questo tale funzione non è molto in voga se non per gli streem sui file.

per quanto riguarda poi quello che dici tu ho fatto una cosa simile solamente che poi ho aggiunrto il codice riportato sopra per svuotare il buffer.

Quello che io vorrei fare è catturare l'errore se il terzo carattere non è nullo e ci riesco anche ma se il terzo carattere è uno spazio non fuinziona....

LoryOne
08-09-2005, 17.04.47
Secondo me dovete crearvi una funzione apposita.
E' impossibile limitare i caratteri digitabili attraverso lo scanf.
Pensate a scanf come ad una sequenza di getchar() che si interrompe alla pressione del tasto invio (conferma stringa immessa) o quando si raggiunge il limite prefissato da un parametro.

punto
09-09-2005, 14.16.07
usa fflush(stdout)

Dr_House
09-09-2005, 16.48.16
fflush() scordiamocelo pure non funge in alcuna maniera.. non mi svuota il buffer... problema ovviato con una semplice while(getchar()!='\n')

Questo mi svuota il buffer.

ma un problema che adesso sorge è questo: facendo

scanf("%2s",stringa);

risolvo molti dei miei problemi si è vero, tant'è che eliminando il contenuto del buffer il programma funziona alla perfezione.

Solamente che de da prompt si inserisce

&>A2 Ciao

o anche

&>C4Ciao

Il programma legge le prime due lettere corrette e continua la sua esecuzione.

Io vorrei evitare questa cosa e fare in modo che quando inserisco

&>A2

Il terminale sia bloccato e NON mi consenta di inserire un terzo carattere.

Alternativamente una gestione errore sul terzo carattere che mi dia un errore se questo è differente da '\0' o '\n'

Ho profato tuttavia a fare un controllo ma, al terzo carattere sia che abbia uno "spazio" o non inserisca nulla, mi genera sempre un errore perché il carattere è null.

Quindi anche quando il controllo dovrebbe essere OK lui stampa l'errore.

Compe posso trovare una delle due soluzioni in termine di codice?

LoryOne
09-09-2005, 18.24.32
Cambia funzione, oppure creane una tu.

Dr_House
09-09-2005, 19.43.06
#include <stdio.h>
#include <stdlib.h>


int main (){
char pro[3];
printf("\n\ninserire la prima coordinata: ");
scanf("%3s", pro);
printf("\n\nin posizione 3 c'è il carattere %c %d\n\n",pro[3],(int)pro[3]);
if((int)pro[3] != '\n')//controla se il carattere successivo è lo spazio e genera un errore
printf("\nErrore %c\n",pro[3]);

while ( getchar() != '\n' ); //ripulisce il buffer
}



Allora faccio dei controlli sul terzo carattere, verificanto appunto che sia lo \n per convalidare la stringa idi due elementi (riga e colonna)

Tuttosommato sia che io prema invio sia che io inserisca uno spazio e prema invio il codice che segnala è semrpe -73 e non pare essere ne \n ne \b.

Qualcuno di voi sa come mai?

LoryOne
10-09-2005, 12.58.55
pro[0] quanto vale ?
Dove è stato inserito il terminatore nullo ?
Cosa cambia se al posto di char pro[3], pro è un puntatore ad una stringa ?

Dr_House
10-09-2005, 13.34.56
se metto un puntatore è la stessa cosa...

Inserisco ad esempio

&>A2

non funge dandomi subito dopo il 2 il valore -73

&>A2Ciao

Lo cattura

&>A2 Ciao

Non mi cattura lo spazio dandomi il -73 nello spazio