在C命令行中传递多个参数

时间:2012-12-07 07:23:19

标签: c arguments getopt

如何使用不同的开关

在这样的C程序中传递多个参数
program -d <argument1> -p <argument2>

我正在使用getopt让我传递参数。

int main(int argc, char **argv)
{
         while(1) 
            {
            unsigned int c = getopt(argc, argv, "-dD:hHgGp:");
            if( c == -1 ) break;

            switch( c ) 
            {
                    case 'D':
                    case 'd':
                    printf("\nd=");
                    strcpy(D,optarg);
                    printf(D);
                    break;

                    case 'g':
                    case 'G':
                    printf("g");
                    break;

                    case 'p':
                    printf("\nPath=");
                    strcpy(pathFile,optarg);
                    printf(pathFile);
                    break;

                    case 'H':
                    case 'h':
                    usage(); //For help
                    return 0;

                    default:
                    return 0;
            }
    }

}

编辑:这里的代码是我用来测试的虚拟代码。它返回以字符串形式传递的参数。

2 个答案:

答案 0 :(得分:3)

您是否忘记了getopt参数中“d”之后的“:”?

unsigned int c = getopt(argc, argv, "-d:D:hHgGp:");

答案 1 :(得分:2)

写这个似乎很奇怪:

while (1) 
{
    unsigned int c = getopt(argc, argv, "-dD:hHgGp:");
    if( c == -1 ) break;

getopt()的返回值为int;为什么要将它保存在unsigned int

int opt;

while ((opt = getopt(argc, argv, "-dD:hHgGp:")) != -1)
{
    switch (opt)
    {
    case ...
    }
}

如果您要使选项不区分大小写(不是一个好主意,IMO),那么请保持一致并处理P:。另外,正如kmkaplananswer首次提到的那样,您有D:d由同一个交换机处理;为了理智,他们都应该跟着冒号:"-d:D:hHgGp:P:"至少是自我一致的。

此外,在大多数情况下,您无需在任何地方复制参数字符串(optarg);您只需在方便的变量中保存指向其当前值的指针。如果复制参数字符串,则必须检查参数的长度,以确保不会溢出缓冲区。

选项字符串的第一个字符通常不是短划线;它不是标准行为。 getopt()的Mac OS X文档确实注意到它是一个GNU扩展,并建议不要用破折号启动一个选项字符串(并且选项字符串应该只包含一个破折号以便向后兼容,而不是新代码 - 再次,在Mac OS X或BSD上)。在GNU getopt()下,前导破折号表示非选项参数被报告为它们是选项。只要您知道自己使用的是GNU getopt()扩展名,就不会有任何伤害。