解析命令shell一样在C中

uurv41yg  于 2023-03-29  发布在  Shell
关注(0)|答案(4)|浏览(84)

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

add node ID

add arc ID from ID to ID

print

exit

等等。然后我想用ID做一些验证,并将它们转发给指定的函数。函数和验证当然已经准备好了。这都是关于解析和匹配函数的...
我用了很多ifstrtok,但我肯定这不是最好的方法...有什么想法吗?

s4chpxco

s4chpxco1#

我想你想要的是这样的:

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);
}

你可以做你想与'命令'和'参数'只是在你释放它之前。

yduiuuwa

yduiuuwa2#

这取决于你的命令语言有多复杂。如果你有几个以上的命令,或者每个命令都可以有多种形式,比如你的add命令,那么你可能需要花点时间编写一个简单的recursive descent parser
过去我曾为一些项目手工编写过几个RDPs。这是一项工作,但它允许你处理一些相当复杂的命令,否则解析起来就不那么简单了。你也可以使用像lex/yacc或flex/野牛这样的解析器生成器,尽管这对你正在做的事情来说可能有点过头了。
否则,基本上就是你所描述的那样;strok和一堆嵌套的if语句。

sulc1iza

sulc1iza3#

我想补充一下理查德·罗斯的回答:检查malloc和realloc的返回值。这可能会导致程序中难以找到的崩溃。

kgsdhlau

kgsdhlau4#

所有命令行参数都将存储在一个名为argv的字符串数组中。
您可以使用argv[0]argv[1] ... argv[n]访问这些值。

相关问题