我已经用C写了一个斐波那契数列。它的功能很好,并且提供的数字也超过3e100。
但是我的问题是,用户想要在中间停止打印过程并退出循环,如何捕获用户输入?
例如,如果他输入要获取系列的前100个数字,则改变主意并希望退出打印过程,而该过程位于中间。怎么做?
我想在循环运行时捕获^c
(CTRL + C),但是我不确定该怎么做。
这是我的代码:
printf("Welcome to Fibonacci Series Mode.\n\nEnter how many numbers do you want from the series, from the start: ");
scanf("%d", &N);
x = 0;
y = 1;
F = 3;
Numbering = 3;
printf("Here is Your Series:\n\n");
if (N == 1)
{
printf("[1] 0\n");
Sleep(1000);
}
if (N == 2)
{
printf("[1] 0\n");
Sleep(75);
printf("[2] 1\n");
Sleep(1075);
}
if (N == 3)
{
printf("[1] 0\n");
Sleep(75);
printf("[2] 1\n");
Sleep(75);
printf("[3] 1\n");
Sleep(1075);
}
if (N > 3)
{
printf("[1] 0\n");
Sleep(75);
printf("[2] 1\n");
Sleep(75);
}
while (N > 3 && F <= N)
{
xy = x + y;
printf("[%.0d] %.5g\n", Numbering, xy);
Sleep(75);
x = y;
y = xy;
F++;
Numbering++;
}
Sleep(1000);
}
这只是我整个代码的一部分,在此不包括在内,这就是为什么您看不到main()
和头文件的原因。
在C中,默认情况下IO处于阻止状态。因此,如果您想听用户输入在循环中,则必须先等待用户输入,然后再继续。
解决方案是使用signals。特别是SIGINT
和CTRL +C。现在,可以在程序侧捕获此信号以进行一些清理或仅执行其他任何操作。您关心的可能是在接收到SIGINT
时使函数正常退出,而不是在打印过程中立即退出。 如果您想捕获信号,可以使用此-
#include <signal.h>
void SIGINT_handler(int sig)
{
// Ignore the signal's default behaviour
signal(sig, SIG_IGN);
// Do graceful printing/cleanup here
exit(0);
}
现在您需要将此功能绑定到SIGINT
,您可以在main
中进行此操作>
signal(SIGINT, INThandler);
会中断。IO期间的信号拦截很难正确处理。如果在注
:这是一个非常简单的示例,仅用于指示正确的方向。由于您在代码中使用printf
,因此此[[will
printf
通话期间调用了信号怎么办? 行为可能不是您想要的样子。更多信息here