2010-10-20 72 views
3

我有一个用C语言编写的简单控制台程序,想要中止文本输入,请使用CTRL + Z。这怎么可能?发送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

你想要类似过程的东西应该停止阅读输入,并在同一时间在后台? – 2010-10-20 15:59:22

+0

更确切地说,我有一个循环,等待用户输入每次迭代,我想用CTRL + Z打破这个循环(因此输入)。 – svenwltr 2010-10-20 16:06:19

+0

给我们一些代码。 – pmg 2010-10-20 17:07:38

回答

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:呵呵......这个说明“%LF”在scanf需要doublevar在你的程序是一个float。也正确

+0

我现在可以测试它。它似乎不起作用。 – svenwltr 2010-10-20 18:29:21

+0

scanf也会返回EOF,如果它到达文件末尾,请检查它。返回值0可能仅仅意味着用户在这种情况下输入了somehing而不是float – nos 2010-10-20 19:09:53

+0

@nos:在这种情况下,我必须在按下Ctrl + Z后按Enter键,这样我才能定义一个字母(例如'q')循环,但我正在寻找更好的东西。 B.t.w .:这不是一个真正的课程,而是一个自学。 – svenwltr 2010-10-20 19:27:42

0

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

1

使用signal.h中帮助陷阱发送SIGTSTP当你打按Ctrl +ž。请注意,您希望捕获SIGTSTP而不是SIGSTOP,因为对于SIGTSOP,只需缺省操作即可执行所需的操作。

当信号产生时,您也可能遇到没有scanf()返回的问题。幸运的是,这个问题已经被问及已经很好地回答:) Scanf with Signals

相关问题