2013-02-16 88 views
0

我試圖寫一個程序,我需要檢查當按下字符的序列,而在運行時從用戶採取投入檢查字符串的一部分。我不知道該怎麼做。 例如,我的字符的序列(關鍵字):Ç程序 - 需要,同時用戶輸入的輸入

togo 

和我的輸入是:當我寫「東鄉」

iamreadytogohome 

我的標誌變量應該從0到1。 我不應該按回車,然後檢查輸入字符串。

+1

你需要傾聽鍵盤事件。看[這個答案](http://stackoverflow.com/a/220876/2046049)。 – 2013-02-16 07:57:05

回答

0

你所能實現的唯一途徑「同時檢查用戶鍵入」是,如果你使用「原始」輸入法。不幸的是,這是不平凡的,而取決於你正在運行的實際系統上 - 這是Windows和Linux完全不同的,如果你正在使用,比如說,MacOS的或Solaris略有不同的Linux。

「原始」輸入的原理是關閉行編輯和緩衝,並且應用程序將在輸入時獲取每個字符,而不是將數據保存在緩衝區中的「熟化」模式,直到用戶點擊進入。

我敢肯定一點谷歌搜索將讓你找到如何做到這一點您的操作系統的 - 搜索「如何讀取輸入而對輸入-insert-OS-這裏」應該這樣做。

不過要小心,你很可能必須處理所有的行編輯 - 例如點擊backspace只會將「退格」發送到您的程序,而不會刪除最後輸入的字符。退格鍵是我的「最命中鍵」之一......

然後,所有你需要的是一個狀態機來跟蹤你在哪裏的togo序列中,並設置一個標誌,當你到了og之後。如果這些字符之間有其他內容出現,顯然狀態機需要重新啓動。

2

POSIX假設 - 您可以使用<termios.h>(檢查省略清晰的錯誤)申報標準的終端控制接口:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <termios.h> 
#include <unistd.h> 

static void init_getc_unbuf() 
{ 
    struct termios term = { 0 }; 
    tcgetattr(0, &term); 

    term.c_lflag &= ~ICANON; 
    term.c_cc[VMIN] = 1; 
    term.c_cc[VTIME] = 0; 
    tcsetattr(0, TCSANOW, &term); 
} 

int getc_unbuf() 
{ 
    char c; 
    static int initted = 0; 
    if (!initted) { 
     init_getc_unbuf(); 
     initted = 1; 
    } 

    read(STDIN_FILENO, &c, 1); 
    return c; 
} 

int main(int argc, char *argv[]) 
{ 
    char line[128]; 
    char buf[128] = { 0 }; 
    char *p = buf; 

    printf("Enter string to search for:\n"); 
    fgets(line, sizeof(line), stdin); 
    char *nl = strchr(line, '\n'); 
    if (nl != NULL) *nl = 0; 

    printf("Now start typing:\n"); 

    do { 
     *p++ = getc_unbuf(); 
    } while(strstr(buf, line) == NULL); 

    printf("\nThe string you are searching for has been entered.\n"); 
    return 0; 
} 
+0

嗨,謝謝你的迴應。代碼有道理..但不幸的是我使用的是Windows操作系統。我試圖從你的代碼中獲得最好的結果,但我無法做到。你可以請幫助我通過givin類似的代碼在C編爲Windows操作系統。我知道我錯過了它的一小部分。在此先感謝 – 2013-02-18 03:21:53

+0

@PriyaKar不,對不起。我不使用Windows,我從來沒有使用Windows API進行編程,我也不打算這樣做,直到它開始在合理的水平上支持C標準庫。看看Max的解決方案 - 這是針對Windows的(尊重他的痛苦)。 – 2013-02-18 05:51:25

0

對於Windows,你可以這樣做:

#include <stdio.h> 
#include <conio.h> 

int main() 
{ 
    char c; 
    int flag=0,state=0; 

    while(flag == 0) 
    { 
     c = getch(); 
     if(state==0 && c=='t') state = 1; 
     else if(state==1 && c=='o') state = 2; 
     else if(state==2 && c=='g') state = 3; 
     else if(state==3 && c=='o') flag = 1; 
     else state = 0; 
    } 
    printf("togo entered"); 

    return 0; 
}