1

C(Cのみ)プログラムでユーザー入力コマンドを解析したい。サンプルコマンド:

add node ID

add arc ID from ID to ID

print

exit

等々。次に、IDを使用して検証を行い、それらを指定された関数に転送します。関数と検証はもちろん準備ができています。関数の解析と照合がすべてです...

私は多くifのsとstrtoksでそれを作りました、しかしそれは最善の方法ではないと確信しています...何かアイデア(libs)?

4

4 に答える 4

2

私はあなたが欲しいものはこのようなものだと思います:

while (1) 
{
    char *line = malloc(128); // we need to be able to increase the pointer
    char *origLine = line;
    fgets(line, 128, stdin);

    char command[20];
    sscanf(line, "%20s ", command);

    line = strchr(line, ' ');

    printf("The Command is: %s\n", command);

    unsigned argumentsCount = 0;
    char **arguments = malloc(sizeof(char *));

    while (1)
    {
        char arg[20];
        if (line && (sscanf(++line, "%20s", arg) == 1))
        {
            arguments[argumentsCount] = malloc(sizeof(char) * 20);
            strncpy(arguments[argumentsCount], arg, 20);

            argumentsCount++;

            arguments = realloc(arguments, sizeof(char *) * argumentsCount + 1);
            line = strchr(line, ' ');
        }
        else {
            break;
        }
    }

    for (int i = 0; i < argumentsCount; i++) {
        printf("Argument %i is: %s\n", i, arguments[i]);
    }

    for (int i = 0; i < argumentsCount; i++) {
        free(arguments[i]);
    }

    free(arguments);
    free(origLine);
}  

すべてを解放する直前に、「コマンド」と「引数」を使用して、やりたいことができます。

于 2012-04-11T19:27:02.953 に答える
1

Richard Ross の返信に何か追加したかっただけです: malloc と realloc から返された値を確認してください。プログラムで見つけにくいクラッシュが発生する可能性があります。

于 2014-05-05T12:40:03.347 に答える
1

コマンド言語がどれほど複雑かによって異なります。2 つ以上のコマンドがある場合、またはコマンドのように各コマンドが複数の形式を取ることができる場合は、単純な再帰降下パーサーを作成する手間をかける価値があるかもしれませんadd

過去にいくつかのプロジェクトでいくつかの RDP を手作業で行ってきました。少し手間がかかりますが、それ以外の方法では簡単に解析できないかなり複雑なコマンドを処理できます。lex/yacc や flex/bison などのパーサー ジェネレーターを使用することもできますが、これはやり過ぎかもしれません。

それ以外の場合は、基本的にあなたが説明したとおりです。ネストされたステートメント strokの束。if

于 2012-04-11T19:15:18.017 に答える
0

すべてのコマンドラインパラメータは、と呼ばれる文字列の配列に格納されますargv

argv[0]これらの値には、、argv[1]...を使用してアクセスできますargv[n]

于 2012-04-11T18:47:19.180 に答える