在C中运行while循环时捕获用户输入

问题描述 投票:1回答:1

我已经用C写了一个斐波那契数列。它的功能很好,并且提供的数字也超过3e100。

但是我的问题是,用户想要在中间停止打印过程并退出循环,如何捕获用户输入?

例如,如果他输入要获取系列的前100个数字,则改变主意并希望退出打印过程,而该过程位于中间。怎么做?

我想在循环运行时捕获^cCTRL + 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 loops input
1个回答
0
投票

在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);

:这是一个非常简单的示例,仅用于指示正​​确的方向。由于您在代码中使用printf,因此此[[will
会中断。IO期间的信号拦截很难正确处理。如果在printf通话期间调用了信号怎么办? 行为可能不是您想要的样子

更多信息here

© www.soinside.com 2019 - 2024. All rights reserved.