将ctrl + z发送到控制台程序

时间:2010-10-20 15:40:42

标签: c input console terminal

我有一个用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;
}

3 个答案:

答案 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,程序中的varfloat。也正确

答案 1 :(得分:1)

使用 signal.h 来帮助捕获当您按 Ctrl + z 时发送的SIGTSTP。请注意,您只想通过SIGTSTP的默认操作来捕获SIGTSTP而不是SIGSTOP,因为暂停是SIGSTOP的必需操作。

生成信号时,您可能还会遇到没有scanf()返回的问题。幸运的是,这个问题已被提出并且已经很好地回答了:) Scanf with Signals

答案 2 :(得分:0)

如果您使用的是类UNIX操作系统,ctrl-z会发送一个SIGSTOP,您可以通过编程方式生成该SIGSTOP,并捕获sigaction。