0

我正在尝试实现一个程序,该程序接受一个进程,后跟一个由管道命令组成的字符串。如何将命令字符串分隔为{单个命令/任意数量的参数数组}“|” 是分隔不同命令的字符。

例如,如果我输入: pipe ls -lt | 猫 Lebowski | 光盘...

我如何让系统识别这里有三个单独的命令行参数要在不同的管道中表示。

4

4 回答 4

2

首先,由于管道是一个特殊符号,因此在传递给程序时需要对其进行转义:

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

在您的主要功能中:

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

包含不同索引处的argv所有这些参数(ls、-lt、|、cat...)。例如,argv[0]lsargv[2]'|'argc是此类参数的总数。

于 2013-03-18T21:08:37.897 回答
1

如果您想自己执行此操作,perreal 的回答非常好。getopt()您也可以为此目的使用一个函数,并在此处记录getopt()

于 2013-03-18T21:11:59.810 回答
1

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;
}
于 2013-03-18T21:14:03.877 回答
0

自从 | 是大多数常见 shell 的特殊字符,您需要引用它们(正如其他人所说)。如果您引用双引号内的所有参数,例如

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

你可以argv[1]strtok_r().

于 2013-03-18T21:15:58.730 回答