2013-03-18 125 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