如何使这个简单的C程序只需按下一个键而不是两个键就可以重新启动



这是我为有用的休息活动制作的自助程序。最后需要键入一个数字,然后按"回车"键重新启动。我宁愿只键入任何内容或任何数字。

#include <stdio.h>
#include <stdlib.h>
main()
{
  int i;
  srand((unsigned)time(NULL));
  i = rand();
  int k;
  k = (int)i%22;
  printf("nn");
   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.comt"); break;
            case 18: printf("t Browse JAVA API"); break;
            case 19: printf("t Left handed writing"); break;
            case 20: printf("tGo outside OUTSIDEt"); break;
            case 21: printf("tCall M&Kt"); break;
            case 22: printf("TRASH CAN BBALLt"); break;

            }
            printf("nnnnnnnnnnnnnnnnnnnnn");
        long g;
        scanf("%d", &g);
        if(g >0){
                 system("cls");
                 main();
                 }

     system("pause");
}

我把它用作一个简单的Windows应用程序。如果还有其他问题,我完全可以接受批评,因为我还是C的新手。我很感激任何提示或建议。

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

#include <conio.h>
int main(void) {
  while (1) {
    /* ... */
    if(kbhit())
    {
       break;
    }
  }
}

main是一个与其他函数类似的函数。除了C运行时的启动函数(通常称为"start()")设置参数并调用它之外,它没有什么特别之处。

尤其是在您不关心argc/argv的情况下。

无论如何,真正的问题是stdin默认情况下是面向行的,所以任何getc/getchar/scanf都将被缓冲,直到回车为止。基于操作系统,有多种方法可以消除这种情况。

setvbuf()和friends可以更改缓冲,但它可能不起作用,这取决于您的操作系统,因为系统的底层文件句柄可能仍处于缓冲状态。

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

首先,您不应该在代码中的任何时候调用main。如果您想重新启动,只需编写一个循环,该循环将持续到终止条件。我记不起根据标准,递归调用main是否有效,但即使是,也有因不受控制的递归而崩溃的风险。

如果您想允许空输入(只需ENTER键)终止输入,您可以使用fgets获得一行(空或非空),然后计算。

我总是把人们指向我强大的用户输入功能,如果你使用它,你可以简单地编写一些代码,比如:

// Force initial entry into loop
int rc = RC_NO_INPUT;
char buff[] = {`x', '`};
:
// Run loop until empty input.
while ((rc == OK) && (*buff != '')) {
    // 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));
}

相关内容

最新更新