1

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

add node ID

add arc ID from ID to ID

print

exit

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

我已经用很多ifs 和strtoks 做到了,但我确信这不是最好的方法......有什么想法(库)吗?

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

这取决于您的命令语言有多复杂。如果您有多个命令,或者每个命令可以采用多种形式,例如您的命令,则可能值得费心构建一个简单的递归下降解析器add

过去,我为一些项目手工完成了几个 RDP。这是一些工作,但它允许您处理一些相当复杂的命令,否则这些命令将无法直接解析。您还可以使用 lex/yacc 或 flex/bison 之类的解析器生成器,尽管这对于您正在做的事情可能是多余的。

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

于 2012-04-11T19:15:18.017 回答
1

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

于 2014-05-05T12:40:03.347 回答
0

您的所有命令行参数都将存储到一个名为argv.

您可以使用argv[0], argv[1]...访问这些值argv[n]

于 2012-04-11T18:47:19.180 回答