c - 在 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()
头文件的原因。
解决方案
在 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
调用怎么办?行为可能不是您希望的样子。
更多信息在这里
推荐阅读
- r - 在数据框中应用列表条件块
- visual-studio-code - 我试图用代码服务器在我的平板电脑上运行 vs 代码
- ios - 将一个以函数作为参数的 Swift 方法导出到 React Native
- javascript - 输入出生日期时,我如何才能使您只能在 15 至 80 岁之间
- scala - 如何使用 Scala 映射方法更新序列?
- android - Firebase - 重新打开应用程序后用户注销时应用程序关闭
- c++ - 使用大括号而不是 make_pair 给出错误
- javascript - 收到此错误 TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer or Uint8Array
- php - htdocs/vendor/composer/autoload_real.php 在第 71 行
- javascript - React - 多个 Axios 请求