簡體   English   中英

在C中解析類似shell的命令

[英]Parsing commands shell-like in C

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

add node ID

add arc ID from ID to ID

print

exit

等等。 然后我想用ID做一些驗證並將它們轉發到指定的函數。 功能和驗證當然是准備好的。 這都是關於解析和匹配函數的...

我和許多做它if S和strtok S,但我敢肯定,這不是最好的辦法...任何想法(庫)?

我想你想要的是這樣的:

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

在你釋放它之前,你可以用'命令'和'參數'做你想做的事。

這取決於您的命令語言有多復雜。 如果你有多個命令,或者如果每個命令可以采用多種形式,例如你的add命令,那么編寫一個簡單的遞歸下降解析器 可能是值得的。

我過去曾為一些項目手工完成了幾個RDP。 這有點工作,但是它允許你處理一些相當復雜的命令,否則這些命令不會直接解析。 您也可以使用像lex / yacc或flex / bison這樣的解析器生成器,盡管這可能對您正在做的事情有些過分。

否則,它基本上就是你所描述的; strok和一堆嵌套的if語句。

我只想在Richard Ross的回復中添加一些內容:檢查malloc和realloc的返回值。 這可能會導致程序中難以發現的崩潰。

所有命令行參數都將存儲到char數組* argv中。您可以使用argv [0],argv [1] ... argv [n]訪問這些值。希望這對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM