[英]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]
为ls
, argv[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.