我有一个用C编写的简单控制台程序,想要用 CTRL + Z 中止文本输入。怎么可能?
编辑:以下是一些代码(未经测试)。
#include <stdio.h>
int main()
{
float var;
while(1)
{
scanf("%lf", &var); // enter a float or press CTRL+Z
if( ??? ) // if CTRL+Z was pressed
{
break;
}
// do something with var
}
printf("Job done!");
return 0;
}
答案 0 :(得分:1)
基本上是这样的:
if (fgets(buf, sizeof buf, stdin)) {
/* process valid input */
} else {
/* Ctrl+Z pressed */
}
如果你在行的中间按Ctrl + Z可能会出现问题,但是从基本开始。
更新OP后编辑
你有
scanf("%lf", &var);
scanf
返回它所执行的分配数。在您的情况下,您只有1个变量,因此scanf
在正常情况下返回1,或者在失败时返回0。只需检查返回值
int n = scanf("%lf", &var);
/* test the return value of scanf: 1 all ok; 0 no conversions; EOF: error/failure */
if (n != 1)
{
break;
}
PS:哦...... scanf中的说明符“%lf”需要double
,程序中的var
为float
。也正确
答案 1 :(得分:1)
使用 signal.h 来帮助捕获当您按 Ctrl + z 时发送的SIGTSTP
。请注意,您只想通过SIGTSTP的默认操作来捕获SIGTSTP而不是SIGSTOP,因为暂停是SIGSTOP的必需操作。
生成信号时,您可能还会遇到没有scanf()
返回的问题。幸运的是,这个问题已被提出并且已经很好地回答了:) Scanf with Signals
答案 2 :(得分:0)
如果您使用的是类UNIX操作系统,ctrl-z会发送一个SIGSTOP,您可以通过编程方式生成该SIGSTOP,并捕获sigaction。