这是我为有用的休息活动制作的自助程序。最后需要键入一个数字,然后按"回车"键重新启动。我宁愿只键入任何内容或任何数字。
#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));
}