簡體   English   中英

在C中解析命令行參數

[英]Parsing Command Line Arguments in C

我正在嘗試實現一個程序,該程序接受一個由管道命令組成的字符串的進程。 如何將命令字符串分隔為{單個命令/任意數量的參數數組}中的“ |” 是分隔不同命令的字符。

例如,如果我輸入:pipe ls -lt | 貓Lebowski | cd ..。

我將如何讓系統識別在不同管道中表示的三個單獨的命令行參數。

首先,由於管道是特殊符號,因此在傳遞給程序時需要對其進行轉義:

pipe ls -lt \| cat Lebowski \| cd .. .

在您的主要功能中:

main(int argc, char *argv[]) {

argv在不同的索引處包含所有這些參數(ls,-lt,|,cat ...)。 例如, argv[0]lsargv[2]'|' argc是此類參數的總數。

如果您想自己做,perreal的答案非常好。 還有一個函數getopt()也可以用於此目的,並在此處進行了記錄getopt()

strtok_r()函數是您的朋友:

char **explode(char *s, const char *sep, size_t *outsz)
{
    size_t allocsz = 4;
    size_t sz = 0;
    char **arr = malloc(allocsz * sizeof(*arr));
    if (arr == NULL) {
        *outsz = 0;
        return NULL;
    }

    char *p, *end;
    for (p = srtok_r(s, sep, &end); p; p = strtok_r(NULL, sep, &end)) {
        if (++sz > allocsz) {
            allocsz <<= 1;
            arr = realloc(arr, sizeof(*arr) * allocsz));
            assert(arr != NULL); // sorry
        }
        arr[sz - 1] = strdup(p);
    }

    *outsz = sz;
    return arr;
}

用法:

int main()
{
    char sentence[] = "The quick brown fox jumped over the lazy dog.";
    size_t sz;
    char **arr = explode(sentence, " ", &sz);
    int i;
    for (i = 0; i < sz; i++) {
        printf("%s\n", arr[i]);
        free(arr[i]);
    }
    free(arr);
    return 0;
}

由於 是大多數常見shell的特殊字符,您需要引用它們(如其他人所述)。 如果您在雙引號內引用所有參數,例如

管道“ ls -lt | cat Lebowski | cd ..”

您可以使用strtok_r()解析argv[1]

暫無
暫無

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

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