0

実行時にユーザーからの入力を取得しているときに、一連の文字が押されたときにチェックする必要があるプログラムを作成しようとしています。その方法がわかりません。たとえば、私の一連の文字(キーワード):

togo

私の入力は次のとおりです。

iamreadytogohome 

「togo」と書くとすぐに、フラグ変数が 0 から 1 に変わるはずです。Enter キーを押して入力文字列をチェックするべきではありません。

4

3 に答える 3

2

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;
}
于 2013-02-16T08:03:39.257 に答える
0

「ユーザーが入力している間のチェック」を実現できる唯一の方法は、「生の」入力メソッドを使用する場合です。残念ながら、これは簡単なことではなく、実行している実際のシステムによって異なります。WindowsとLinuxでは完全に異なり、MacOSやSolarisなどを使用している場合はLinuxとは少し異なります。

「生の」入力の原則は、行編集とバッファリングがオフになり、ユーザーがEnterキーを押すまでデータがバッファに保持される「調理済み」モードではなく、アプリケーションが入力時にすべての文字を取得することです。 。

少しグーグルすると、OSでそれを行う方法を見つけることができると確信しています。「-insert-OS-hereを入力せずに入力を読み取る方法」を検索すると、それができるはずです。

ただし、ほとんどの場合、すべての行編集を処理する必要があることに注意してください。たとえば、バックスペースを押すと、最後に入力した文字が消去されるのではなく、プログラムに「バックスペース」が送信されます。バックスペースは私の「最もヒットしたキー」の1つです...

次に必要なのは、、、のシーケンスのどこにいるかを追跡しtoafterを押したときにフラグを設定するgステートマシンだけです。これらの文字の間に何か他のものが入った場合、明らかにステートマシンを再起動する必要があります。oog

于 2013-02-16T07:56:52.250 に答える
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;
}
于 2013-02-16T08:05:19.260 に答える