繁体   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