C prog - 需要在用户输入输入时检查字符串的一部分

时间:2013-02-16 07:26:01

标签: c string input sequence

我正在尝试编写一个程序,我需要检查何时按下一个字符序列,同时在运行时从用户那里获取输入。我不知道该怎么做。 例如,我的字符序列(关键字):

togo

我的意见是:

iamreadytogohome 

一旦我写“togo”,我的标志变量应该从0变为1。 我不应该按Enter键然后检查输入字符串。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

如果使用“原始”输入法,则可以实现“在用户输入时进行检查”的唯一方法。不幸的是,这是非常重要的,取决于您运行的实际系统 - 它对于Windows和Linux来说完全不同,如果您使用的是MacOS或Solaris,则与Linux略有不同。

“原始”输入的原理是关闭行编辑和缓冲,应用程序将获取键入的每个字符,而不是“熟”模式,其中数据保存在缓冲区中,直到用户点击进入。

我确定谷歌搜索会让你找到如何在你的操作系统上执行此操作 - 搜索“如何在不插入-insert-OS-here的情况下读取输入”应该这样做。

请注意,您很可能必须处理所有行编辑 - 例如点击退格键只会向你的程序发送“退格”,而不是删除最后输入的字符。退格键是我“最受欢迎的键”之一......

然后您只需要一台状态机来跟踪您在togo的序列中的位置,并在您点击时设置一个标记o之后的g。如果这些字符之间出现其他内容,显然状态机需要重新启动。

答案 2 :(得分: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;
}