首页 > 解决方案 > 在 C 中运行 while 循环时捕获用户输入

问题描述

我用 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()头文件的原因。

标签: cloopsinput

解决方案


在 C 中,IO 默认是阻塞的。因此,如果您想在循环期间收听用户输入,则必须等待用户输入才能继续。

解决方案是使用信号。特别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代码中使用,这中断。

IO 期间的信号拦截很难做到正确。如果信号在通话过程中被printf调用怎么办?行为可能不是您希望的样子。

更多信息在这里


推荐阅读