Un scanf avec un compte à rebours actif.

Une fonction qui vous propose 20 secondes pour taper un nombre.

getch,kbhit,time.h

Voir version :

Pas de dépendances

Télécharger :

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int timeoutgetnb(int* remaining,const char* chaine)
{
    int timeleft;
    char cache[11] = {0};
    int curs = 0;
    time_t starttime = time(NULL);
    printf("\r%s [%d] : %s          ",chaine,*remaining,cache);    
    do 
    {
        time_t crt = time(NULL);
        if (difftime(crt,starttime)>=1.0)
        {
            starttime = crt;
            (*remaining)--;
            printf("\r%s [%d] : %s          ",chaine,*remaining,cache);    
        }
        if (_kbhit())
        {
            char c = (char)getch();
            if (c>='0' && c<='9' && curs<10)
                cache[curs++] = c;
            if (c==0x0D)
            {
                printf("\n");
                return atoi(cache);
            }
            if (c=='\b' && curs!=0)
                cache[--curs] = '\0';
            printf("\r%s [%d] : %s          ",chaine,*remaining,cache);    
        }
    } while ((*remaining)>0);
    printf("\n");
    return -1;
}


int main()
{
    int delay = 20;  // 20 secondes
    int res = timeoutgetnb(&delay,"Entrez nombre");
    printf("Resultat : %d\n",res);
    return 0;
}



Commentaires


	Un programme amusant.
	C'est un scanf reprogrammé avec les fonctions kbhit et getch.
	Pendant ce temps, le temps s'écoule.


	int* remaining, c'est un pointeur sur la variable remaining : ça permettra de modifier l'appelant, autrement dit de changer, depuis la fonction, la variable delay du main.

	(le but étant d'avoir la variable delay a jour en sortant de la fonction : ainsi si tu la rappelle, le chrono repart de la ou il était, idéal pour un +/- chronométré)

	0x0D est le code de retour à la ligne. Si tu appuies sur "enter", ce code est regénéré.

	La fonction atoi convertit la chaine en int.

	Je me sers de time pour récupérer le nobre de secondes restantes.
	Si on appuie sur une touche, je regarde si c'est un chiffre, auquel cas je valide, ou return, auquel cas je sors, ou \b
	\b c'est backspace. Je gère donc l'effacement. Si vous vous êtes trompé de chiffre, appuyez sur backspace

	Notez que ça peut très bien marcher pour autre chose que des nombres.