Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C][RISOLTO] - Bloccare input della tastiera in console
Forum - C/C++ - [C][RISOLTO] - Bloccare input della tastiera in console

Avatar
Mikelius (Member)
Rookie


Messaggi: 59
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 20:32
Domenica, 09/07/2017
Salve a tutti.
Prendiamo ad esempio questo piccolo codice:
Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2. #include <Windows.h>
  3.  
  4. int main( int argv, char *argc[] ){
  5.  
  6.     int i = 0;
  7.  
  8.     Sleep( 6000 );
  9.     printf( "%s", "Inserisci in numero:" );
  10.     scanf( "%d", &i);
  11.     return 0;
  12. }



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...."
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5369
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:02
Domenica, 09/07/2017
Puoi scrivere

Codice sorgente - presumibilmente Plain Text

  1. BlockInput(TRUE);
  2. Sleep(6000);
  3. 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 ...
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 162
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 22:12
Domenica, 09/07/2017
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."
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1109
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 22:45
Domenica, 09/07/2017
Finito lo sleep, subito prima di eseguire la scanf potresti svuotare il buffer della tastiera.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
Mikelius (Member)
Rookie


Messaggi: 59
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 1:28
Lunedì, 10/07/2017
Testo quotato

Postato originariamente da nessuno:

Puoi scrivere

Codice sorgente - presumibilmente Plain Text

  1. BlockInput(TRUE);
  2. Sleep(6000);
  3. 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"

Testo quotato

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.


Testo quotato

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...."
PM Quote
Avatar
TheDarkJuster (Member)
Guru


Messaggi: 1399
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 1:44
Lunedì, 10/07/2017
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
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 162
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 7:50
Lunedì, 10/07/2017
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."
PM Quote
Avatar
Mikelius (Member)
Rookie


Messaggi: 59
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 9:43
Lunedì, 10/07/2017
Testo quotato

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...."
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 354
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 13:28
Lunedì, 10/07/2017
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 :rofl:

PM Quote