Cómo usar kbhit y getch (programación en C) [closed]

3 minutos de lectura

avatar de usuario
Perdóname

Estoy tratando de crear una función que printf una determinada cadena si el usuario presiona cualquier botón en el teclado EXCEPTO para mayúsculas Psi el usuario presiona P entonces romperá el bucle.

Sin embargo, no creo que esté usando _kbhit y _getch adecuadamente. Yo uso el número 80 porque ese es el símbolo ASCII para 80… lo siento por cualquier confusión

void activateAlarm(int channelID) {

    int key = 0;

    while(temperatureChannel[channelID].currentTemperature > temperatureChannel[channelID].highLimit
        ||temperatureChannel[channelID].currentTemperature < temperatureChannel[channelID].lowLimit) {

        beep(350,100);

        if (_kbhit()) {
            key = _getch();
            if(key == 'P');
                break;
        }    
    }
}

  • if (key == 'P'); break; debería ser más bien if (key == 'P') break;

    – mooooooooooooooooooooooo

    17 de abril de 2015 a las 6:40

avatar de usuario
masud

No es necesario explicar, el código habla mejor:

#include <conio.h>

// ...

printf("please press P key to pause \n ");

int key = 0;

while(1)
{
    if (_kbhit())
    {
      key =_getch();

      if (key == 'P')
        break;
    }    
}

  • La edición #4 debería no han sido aprobados ya que introdujo varios errores en el código: (1) Era correcto declarar key como un intya que ese es el tipo de retorno real de _getch(). (2) Los guiones bajos iniciales en _kbhit() y _getch() no debería haber sido eliminado; las bibliotecas de Visual C++ no definen la mayoría de las adiciones de estilo POSIX usando los nombres POSIX porque, técnicamente, violan el estándar ISO C++.

    – Adrián McCarthy

    10 de febrero de 2017 a las 17:45


  • @AdrianMcCarthy kbhit y getch no son funciones definidas por POSIX. Definir estas funciones sin guiones bajos tampoco infringe los estándares C/C++/POSIX. La razón real por la que tenemos que incluir el guión bajo es porque las funciones sin guión bajo alguna vez existieron como restos de un intento fallido de Microsoft de cumplir con el estándar POSIX. Su intento fue miserable, ha quedado obsoleto y, a partir de Windows 8, se ha eliminado por completo. El guión bajo existe para evitar que se compilen los ejecutables antiguos que usan las funciones POSIX rotas.

    – yyny

    2 mayo 2019 a las 14:11

  • Microsoft originalmente solo creó una capa mínima de compatibilidad con POSIX por motivos contractuales. Hoy en día, hay alternativas mucho mejores que deberían usarse en su lugar. Las nuevas funciones con guiones bajos, aunque no se ajustan a POSIX, probablemente estén más cerca de lo que esperaría que hicieran que las funciones POSIX rotas originales. Si está usando MinGW, ya los ha estado usando, incluso si no incluyó los guiones bajos.

    – yyny

    2 mayo 2019 a las 14:13

  • @YoYoYonnY: getch de hecho está definido por Posix: pubs.opengroup.org/onlinepubs/007908799/xcurses/getch.html

    – Adrián McCarthy

    2 mayo 2019 a las 17:26

  • @YoYoYonnY: Tienes razón en eso kbhit no es de Posix, vino de DOS. Microsoft ha sostenido durante mucho tiempo que agregar funciones a la biblioteca estándar de C++ es una violación del estándar de C++ [probably a strict reading of S17.1 P2 [library.general]]. Su solución es cambiar el nombre de esas funciones no estándar con un guión bajo al principio porque están “reservadas a la implementación para usarlas como un nombre en el espacio de nombres global”. [S17.6.4.3.2 [global.names]]

    – Adrián McCarthy

    2 mayo 2019 a las 17:39

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad