如何只用一次按键而不是两次按键重启这个简单的C程序

时间:2012-03-04 05:12:02

标签: c windows console

这是我为有用的休息活动制作的自助计划。在它结束时需要输入一个数字,然后按“回车”重新启动。我宁愿只输入任何东西,或任何数字。

#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 个答案:

答案 0 :(得分:4)

如果您有权访问conio库,则可以使用kbhit()来获取按键:

#include <conio.h>

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

    if(kbhit())
    {
       break;
    }
  }
}

答案 1 :(得分:1)

main是一个与其他任何功能一样的功能。除了C Runtime的启动功能(通常称为&#39; start()&#39;设置参数并调用它时,没有什么特别之处。坚持。

特别是在您不关心argc / argv的情况下。

无论如何 - 你真正的问题是stdin默认是面向行的 - 所以任何getc / getchar / scanf都会被缓冲,直到回车。有多种方法可以根据操作系统撤消此操作。

setvbuf()和朋友可以更改缓冲,但它可能不起作用,具体取决于您的操作系统,因为系统的基础文件句柄可能会保持缓冲。

某些操作系统还有其他功能,如kbhit(); (不是ansi)等。对不起,这不是一个可靠的答案 - 你的操作系统是什么?

答案 2 :(得分:1)

首先,您不应该在代码中的任何位置调用main。如果你想重启,只需编写一个循环,直到终止条件。我不记得是否根据标准递归调用main是有效的,但即使它,你也可能因为不受控制的递归而崩溃。

如果你想允许空条目(只有ENTER键)来终止输入,你可以使用fgets来获取一行(空或不空),然后评估它。

我总是将人们指向my robust user input function,如果你使用它,你可以简单地编写类似的代码:

// 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));
}