Как сделать так, чтобы эта простая программа на C перезапускалась всего одним нажатием клавиши вместо двух? - PullRequest
1 голос
/ 04 марта 2012

Это программа самопомощи, которую я сделал для полезных перерывов. В конце необходимо ввести номер, затем нажать «ввод» для перезагрузки. Я бы предпочел набрать только что-нибудь или любое число.

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

main()
{
  int i;

  srand((unsigned)time(NULL));

  i = rand();

  int k;
  k = (int)i%22;
  printf("\n\n");

   switch(k){


            case 0: printf("%\t Weather"); printf(" weather"); break;                        
            case 1: printf("\t Hand exercises ok"); break;

            case 2: printf("\t BR break"); break;

            // etc etc            
            case 15: printf("\t ~~ DOODLE ON PAPER ## "); break;
            case 16: printf("\t Practice Mental Math "); break;
            case 17: printf(" \tgo to SNOPES.com\t"); break;

            case 18: printf("\t Browse JAVA API"); break;
            case 19: printf("\t Left handed writing"); break;
            case 20: printf("\tGo outside OUTSIDE\t"); break;
            case 21: printf("\tCall M&K\t"); break;
            case 22: printf("TRASH CAN BBALL\t"); break;


            }

            printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

        long g;

        scanf("%d", &g);

        if(g >0){
                 system("cls");
                 main();
                 }


     system("pause");
}

Я использую это как простое приложение для Windows. Если есть другие проблемы / проблемы, я полностью открыт для критики, поскольку я все еще плохо знаком с C. Я ценю любые советы или рекомендации.

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Если у вас есть доступ к библиотеке conio, вы можете использовать kbhit(), чтобы перехватить нажатие клавиши:

#include <conio.h>

int main(void) {
  while (1) {
    /* ... */

    if(kbhit())
    {
       break;
    }
  }
}
1 голос
/ 04 марта 2012

Во-первых, вы не должны звонить main в любой точке вашего кода.Если вы хотите перезапустить, просто закодируйте цикл, который продолжается до условия завершения.Я не могу вспомнить, является ли рекурсивный вызов main действительным в соответствии со стандартом, но, даже если он был, , вы рискуете потерпеть крах из-за неконтролируемой рекурсии.запись (только клавиша ENTER), чтобы завершить ввод, вы можете использовать fgets, чтобы получить строку (пустую или нет), а затем оценить это.

Я всегда указываю людям на мою надежную функцию пользовательского ввода и, если вы используете это, вы можете просто написать что-то вроде:

// Force initial entry into loop
int rc = RC_NO_INPUT;
char buff[] = {`x', '\0`};
:
// Run loop until empty input.
while ((rc == OK) && (*buff != '\0')) {
    // Do whatever you need to do here.

    // Get input, 'while' loop will check it.
    rc = getLine ("ENTER to exit, anything else to continue: ",
        buff, sizeof (buff));
}
1 голос
/ 04 марта 2012

main - это функция, как и любая другая. В этом нет ничего особенного, кроме функции запуска C Runtime (обычно называемой start ()), устанавливающей параметры и вызывающей ее. Офигеть.

Особенно в вашем случае, когда вас не заботит argc / argv.

В любом случае - ваша настоящая проблема в том, что stdin по умолчанию ориентирован на строку - поэтому любой getc / getchar / scanf будет буферизироваться до возврата каретки. Существует несколько способов отменить это в зависимости от ОС.

setvbuf () и друзья могут изменить буферизацию, но она может не работать в зависимости от вашей ОС, поскольку базовые файловые дескрипторы системы могут оставаться в буфере.

Некоторые ОС имеют другие функции, такие как kbhit (); (не анси) или тому подобное. Извините, это не точный ответ - какая у вас ОС?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...