0

我如何能够在这样的 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;
            }
    }

}

编辑:这里的代码是我用于测试的虚拟代码。它返回作为字符串传递的参数。

4

2 回答 2

3

仅仅是因为您在参数中忘记了“d”之后的“:”getopt吗?

unsigned int c = getopt(argc, argv, "-d:D:hHgGp:");
于 2012-12-07T07:37:04.143 回答
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:。此外,正如kmkaplan回答首先指出的那样,您拥有D:并被d同一个开关处理;为了理智起见,它们都应该跟一个冒号:"-d:D:hHgGp:P:"至少是自洽的。

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

选项字符串的第一个字符通常不是破折号;这不是标准行为。Mac OS X 文档getopt()确实指出它是一个 GNU 扩展,并建议不要使用破折号开始选项字符串(并且选项字符串应该只包含一个破折号以实现向后兼容性,而不是在新代码中 - 同样,在 Mac OS X 上或 BSD)。在 GNU 下getopt(),前导破折号表示非选项参数被报告为选项。只要您知道您正在使用 GNUgetopt()扩展,这样做就没有坏处。

于 2012-12-07T07:40:46.883 回答