在C中解析类似shell的命令

时间:2012-04-11 18:45:00

标签: c parsing shell command ansi

我想在我的C(只是C)程序中解析用户输入命令。示例命令:

add node ID

add arc ID from ID to ID

print

exit

等等。然后我想用ID做一些验证并将它们转发到指定的函数。功能和验证当然是准备好的。这都是关于解析和匹配函数......

我用很多ifstrtok制作了它,但我确定这不是最好的方法......任何想法(libs)?

4 个答案:

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

你可以在释放之前用'命令'和'参数'做你想做的事。

答案 1 :(得分:1)

这取决于您的命令语言有多复杂。如果您有多个命令,或者如果每个命令可以采用多种形式,例如{{1},那么它可能值得去解决一个简单的recursive descent parser的麻烦命令。

我过去曾为一些项目手工完成了几个RDP。这有点工作,但是它允许你处理一些相当复杂的命令,否则这些命令不会直接解析。你也可以使用像lex / yacc或flex / bison这样的解析器生成器,虽然这对你正在做的事情可能有点过分。

否则,它基本上就是你所描述的; add和一堆嵌套的strok语句。

答案 2 :(得分:1)

我只想在Richard Ross的回复中添加一些内容:检查malloc和realloc的返回值。这可能会导致您的程序难以发现崩溃。

答案 3 :(得分:0)

所有命令行参数都将存储到char数组* argv中。您可以使用argv [0],argv [1] ... argv [n]访问这些值。希望这对您有帮助。