Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] kbhit() ritorna sempre true dopo pressione tasto

    Premetto che ho iniziato a programmare solo da qualche mese. Riporto il codice:

    codice:
    #include <stdio.h>
    #include <conio.h>
    int main()
    {
       do
       {
              do
              {
                   printf("prova 1");
                   system("cls");
               }while(!kbhit());
       printf("prova 2");
       system("cls");
    }while(1);

    Il problema è che in teoria dovrebbe uscire dal ciclo quando premo un tasto e dopo stampare "prova2" una sola volta ogni volta che premo un tasto; invece dopo che premo la prima volta mi salta il secondo ciclo come se la condizione kbhit() rimanesse vera.
    Mi scuso per la pessima spiegazione
    Ultima modifica di LeleFT; 19-12-2016 a 16:08 Motivo: Aggiunti i tag CODE

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    In effetti kbhit() ritorna 0 se non c'è nulla sul buffer della tastiera, mentre ritorna un valore diverso finchè c'è qualcosa sul buffer... e quel qualcosa rimane sul buffer finchè qualcuno non lo va a leggere. Tu non leggi nulla da tastiera, kbhit() non legge (non rimuove) nulla dal buffer, quindi dopo che l'utente ha premuto un tasto (e quindi nel buffer della tastiera c'è un carattere) quello rimane lì indefinitamente e kbhit() continua a ritornare un valore diverso da 0.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    grazie per la correzione del testo
    Ultima modifica di mattiapanto; 19-12-2016 a 17:39

  4. #4
    Ero giunto alla tua stessa conclusione e per questo ho provato ad utilizzare "fflush()" per svuotare il buffer ma il risultato è lo stesso. Probabilmente sbaglio la posizione di fflush() o ho sbagliato propio il suo utilizzo.

  5. #5
    Ok ho risolto così:
    #include<stdio.h>
    #include<conio.h>
    int main()
    {
    do
    {
    if(!kbhit())
    {
    printf("prova1");
    system("cls");
    }
    else
    {
    printf("prova2");
    getch();
    system("cls");
    }
    }while(1);
    }
    In questo modo il problema è risolto ma non capisco il perchè; non dovrebbe risultare sempre vera la condizione come nel caso precedente?perchè si deve aggiungere getch(), non basta kbhit?
    Ultima modifica di mattiapanto; 21-12-2016 a 18:28

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    No e l'ho spiegato prima il perchè: kbhit() si limita a verificare se c'è qualcosa nel buffer della tastiera, ma non rimuove nulla da quel buffer. Al contrario, getch() effettua una vera e propria lettura del buffer: legge il primo carattere disponibile, lo rimuove dal buffer e lo restituisce al chiamante.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.