2013-03-18 124 views
0

我想實現一個程序,它接受一個進程後跟一個由管道命令組成的字符串。如何將命令字符串分成{獨立命令/任意數量的參數數組}}「|」是分隔不同命令的角色。解析C中的命令行參數

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

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

+0

看看'strtok' – 2013-03-18 21:04:21

回答

2

所有自管的首先是你傳遞給一個程序時需要逃避它一個特殊的符號:

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

在您的主要功能:

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

argv包含了所有這些參數( ls,-lt,|,cat ...)在不同的指數。例如,argv[0]ls,argv[2]'|'argc是這樣的參數的總數。

+0

您的迴應的第一行概述了我需要發生的事情。我必須解析參數而不用分隔參數 – user2112062 2013-03-18 21:19:54

+1

的「\」,所以你正在實現一個shell和閱讀輸入與scanf或類似?在這種情況下,H2CO3的答案就是一個 – perreal 2013-03-18 21:21:51

1

如果你想自己做這個,perreal的答案是非常好的。還有一個功能getopt(),您可以使用用於此目的,以及和記錄在這裏getopt()

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; 
} 
0

由於|是最常見貝殼的特殊字符,你需要引用它們(正如其他人所說的)。如果你引用雙引號如

管的 「ls -lt |貓謀殺綠腳趾| CD ..」 內的所有參數

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

+0

我討厭對安全問題做出評論,但**請不要使用'strtok()'。''strtok_r()'是安全的(特別是可重入的)變種。 – 2013-03-18 21:33:01

+0

@ H2CO3感謝您的建議。自從我完成純C編程已經很長時間了。 – 2013-03-18 21:35:02

+0

沒問題,我看你已經修好了。別客氣。 – 2013-03-18 21:35:38