我正在尝试编写一个程序,在该程序中,我需要在运行时从用户那里获取输入时检查何时按下了一系列字符。我不知道该怎么做。例如,我的字符序列(关键字):
togo
我的意见是:
iamreadytogohome
一旦我写“togo”,我的标志变量应该从 0 变为 1。我不应该按 enter 然后检查输入字符串。
POSIX assumed - you can use the standard terminal control interface declared in <termios.h>
(error checking omitted for clarity):
#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,您可以执行以下操作:
#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;
}
您可能实现“在用户键入时进行检查”的唯一方法是使用“原始”输入法。不幸的是,这很重要,并且取决于您运行的实际系统 - Windows 和 Linux 完全不同,如果您使用的是 MacOS 或 Solaris,则与 Linux 略有不同。
“原始”输入的原理是关闭行编辑和缓冲,应用程序将在输入时获取每个字符,而不是“熟”模式,即数据保存在缓冲区中,直到用户点击回车.
我敢肯定,谷歌搜索会让您找到如何在您的操作系统上执行此操作 - 搜索“如何在不输入 -insert-OS-here 的情况下读取输入”应该可以做到。
但是请注意,您很可能必须处理所有行编辑 - 例如,按退格键只会将“退格键”发送到您的程序,而不是删除最后输入的字符。退格键是我的“最热门键”之一...
然后,您所需要的只是一个状态机来跟踪您在 , 和 的序列中的位置,t
并在您点击after时设置一个标志。如果这些字符之间有其他东西,显然状态机需要重新启动。o
g
o
o
g