
Mikelius (Member)
Expert
    
Messaggi: 274
Iscritto: 14/04/2017
|
Salve a tutti.
Prendiamo ad esempio questo piccolo codice:
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <Windows.h> int main( int argv, char *argc[] ){ int i = 0; Sleep( 6000 ); printf( "%s", "Inserisci in numero:" ); scanf( "%d", &i); return 0; }
|
Quando lo mando in esecuzione, se per sbaglio o per "atto malefico" premo dei tasti in quei 6 s, questi veranno ad accodarsi sulla console dopo "Inserisci numero" costringendomi a cancellare tutti i caratteri scritti prima di inserire il numero voluto.
Esiste un modo per evitare che si verifichi questo?
Come ad esempio inibire la tastiera fino alla richiesta del numero o redirigere tutto quello premuto in un buffer "ausiliario" per poi buttarlo via?
avevo visto qualcosa con gli interrupt sotto sistemi UNIX , ma cercherei qualcosa di più semplice se esiste (e magari portabile/sotto Windows)
In genere programmo con Visual Studio 2017 community, raramente con code::block
Ultima modifica effettuata da Mikelius il 14/07/2017 alle 8:40
"Io ne ho viste cose che voi umani non potreste immaginarvi...." |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 5600
Iscritto: 03/01/2010
|
Puoi scrivere
Codice sorgente - presumibilmente Plain Text |
BlockInput(TRUE);
Sleep(6000);
BlockInput(FALSE);
|
ma devi eseguire "As Administrator"
Ultima modifica effettuata da nessuno il 09/07/2017 alle 22:03
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ... |
|

Template (Member)
Pro
    
Messaggi: 177
Iscritto: 09/12/2015
|
Il C non vede direttamente la console, quindi non hai modo di gestire la cosa senza ricorrere a peculiarità specifiche del sistema, come ad esempio la funzione WINAPI proposta da Nessuno.
Ultima modifica effettuata da Template il 09/07/2017 alle 22:13
"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande." |
|

Roby94 (Member)
Guru
    
Messaggi: 1143
Iscritto: 28/12/2009
|
Finito lo sleep, subito prima di eseguire la scanf potresti svuotare il buffer della tastiera.
|
|

Mikelius (Member)
Expert
    
Messaggi: 274
Iscritto: 14/04/2017
|
Postato originariamente da nessuno:
Puoi scrivere
Codice sorgente - presumibilmente Plain Text |
BlockInput(TRUE);
Sleep(6000);
BlockInput(FALSE);
|
ma devi eseguire "As Administrator" |
Grazie, la soluzione è fattibile, l'unico problema è che il programma deve essere eseguito con i privileggi "as administrator"
Postato originariamente da Template:
Il C non vede direttamente la console, quindi non hai modo di gestire la cosa senza ricorrere a peculiarità specifiche del sistema, come ad esempio la funzione WINAPI proposta da Nessuno. |
Già, mi aspettavo qualcosa del genere.
Postato originariamente da Roby94:
Finito lo sleep, subito prima di eseguire la scanf potresti svuotare il buffer della tastiera. |
Provato. con la getchar() si presenta sempre l echo dei tasti premuti.
con la getch() invece dovrei sapere a priori il numero esatto di tasti premuti prima.
"Io ne ho viste cose che voi umani non potreste immaginarvi...." |
|

TheDarkJuster (Member)
Guru^2
    
Messaggi: 1495
Iscritto: 27/09/2013
|
potresti usare la getchar per leggere i caratteri "malefici".
Io ricordo di aver visto alle superiori un "miracoloso" fflush(stdin) ......... Leggo però che non dovrebbe essere usato.....
P.S. la soluzione "corretta" è quella di avere una funzione che legge da tastiera e controlla che l'input sia un numero e in caso negativo ripone la domanda.... e in caso positivo ritorna tale numero
Ultima modifica effettuata da TheDarkJuster il 10/07/2017 alle 1:52 |
|

Template (Member)
Pro
    
Messaggi: 177
Iscritto: 09/12/2015
|
NON PUOI ASSOLUTAMENTE utilizzare getchar() o pulire stdin, per un motivo molto semplice: a meno che tu non abbia premuto ENTER subito dopo aver digitato impropriamente (che felice coincidenza!), quei caratteri di fatto non sono ancora nello stream di input alla fine dello sleep.
"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande." |
|

Mikelius (Member)
Expert
    
Messaggi: 274
Iscritto: 14/04/2017
|
Postato originariamente da Template:
NON PUOI ASSOLUTAMENTE utilizzare getchar() o pulire stdin, per un motivo molto semplice: a meno che tu non abbia premuto ENTER subito dopo aver digitato impropriamente (che felice coincidenza!), quei caratteri di fatto non sono ancora nello stream di input alla fine dello sleep. |
anche questo è vero.
con getche() risolvo questo problema, ma dovrei comunque conoscere l'esatto numero di caratteri "malefici"
"Io ne ho viste cose che voi umani non potreste immaginarvi...." |
|

lumo (Member)
Expert
    
Messaggi: 431
Iscritto: 18/04/2010
|
Purtroppo l'unico modo di controllare l'input da console in modo decente è usare le API di sistema, su linux si comunica attraverso le tty, su windows altro, ma con getchar stai fresco
|
|