2010-10-20 68 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

相關問題