我試圖寫一個程序,我需要檢查當按下字符的序列,而在運行時從用戶採取投入檢查字符串的一部分。我不知道該怎麼做。 例如,我的字符的序列(關鍵字):Ç程序 - 需要,同時用戶輸入的輸入
togo
和我的輸入是:當我寫「東鄉」
iamreadytogohome
我的標誌變量應該從0到1。 我不應該按回車,然後檢查輸入字符串。
我試圖寫一個程序,我需要檢查當按下字符的序列,而在運行時從用戶採取投入檢查字符串的一部分。我不知道該怎麼做。 例如,我的字符的序列(關鍵字):Ç程序 - 需要,同時用戶輸入的輸入
togo
和我的輸入是:當我寫「東鄉」
iamreadytogohome
我的標誌變量應該從0到1。 我不應該按回車,然後檢查輸入字符串。
你所能實現的唯一途徑「同時檢查用戶鍵入」是,如果你使用「原始」輸入法。不幸的是,這是不平凡的,而取決於你正在運行的實際系統上 - 這是Windows和Linux完全不同的,如果你正在使用,比如說,MacOS的或Solaris略有不同的Linux。
「原始」輸入的原理是關閉行編輯和緩衝,並且應用程序將在輸入時獲取每個字符,而不是將數據保存在緩衝區中的「熟化」模式,直到用戶點擊進入。
我敢肯定一點谷歌搜索將讓你找到如何做到這一點您的操作系統的 - 搜索「如何讀取輸入而對輸入-insert-OS-這裏」應該這樣做。
不過要小心,你很可能必須處理所有的行編輯 - 例如點擊backspace只會將「退格」發送到您的程序,而不會刪除最後輸入的字符。退格鍵是我的「最命中鍵」之一......
然後,所有你需要的是一個狀態機來跟蹤你在哪裏的t
,o
,g
和o
序列中,並設置一個標誌,當你到了o
在g
之後。如果這些字符之間有其他內容出現,顯然狀態機需要重新啓動。
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;
}
嗨,謝謝你的迴應。代碼有道理..但不幸的是我使用的是Windows操作系統。我試圖從你的代碼中獲得最好的結果,但我無法做到。你可以請幫助我通過givin類似的代碼在C編爲Windows操作系統。我知道我錯過了它的一小部分。在此先感謝 – 2013-02-18 03:21:53
@PriyaKar不,對不起。我不使用Windows,我從來沒有使用Windows API進行編程,我也不打算這樣做,直到它開始在合理的水平上支持C標準庫。看看Max的解決方案 - 這是針對Windows的(尊重他的痛苦)。 – 2013-02-18 05:51:25
對於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;
}
你需要傾聽鍵盤事件。看[這個答案](http://stackoverflow.com/a/220876/2046049)。 – 2013-02-16 07:57:05