Oppure

Loading
09/07/17 18:32
Mikelius
Salve a tutti.
Prendiamo ad esempio questo piccolo codice:

#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 14/07/17 6:40
aaa
09/07/17 20:02
nessuno
Puoi scrivere

BlockInput(TRUE);
Sleep(6000);
BlockInput(FALSE);


ma devi eseguire "As Administrator"
Ultima modifica effettuata da nessuno 09/07/17 20:03
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
09/07/17 20:12
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.
Ultima modifica effettuata da Template 09/07/17 20:13
aaa
09/07/17 20:45
Roby94
Finito lo sleep, subito prima di eseguire la scanf potresti svuotare il buffer della tastiera.
aaa
09/07/17 23:28
Mikelius
Postato originariamente da nessuno:

Puoi scrivere

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.
aaa
09/07/17 23:44
TheDarkJuster
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 09/07/17 23:52
aaa
10/07/17 5:50
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.
aaa
10/07/17 7:43
Mikelius
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"
aaa