[英]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.