如何使用不同的开关
在这样的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;
}
}
}
编辑:这里的代码是我用来测试的虚拟代码。它返回以字符串形式传递的参数。
答案 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:
。另外,正如kmkaplan的answer首次提到的那样,您有D:
和d
由同一个交换机处理;为了理智,他们都应该跟着冒号:"-d:D:hHgGp:P:"
至少是自我一致的。
此外,在大多数情况下,您无需在任何地方复制参数字符串(optarg
);您只需在方便的变量中保存指向其当前值的指针。如果复制参数字符串,则必须检查参数的长度,以确保不会溢出缓冲区。
选项字符串的第一个字符通常不是短划线;它不是标准行为。 getopt()
的Mac OS X文档确实注意到它是一个GNU扩展,并建议不要用破折号启动一个选项字符串(并且选项字符串应该只包含一个破折号以便向后兼容,而不是新代码 - 再次,在Mac OS X或BSD上)。在GNU getopt()
下,前导破折号表示非选项参数被报告为它们是选项。只要您知道自己使用的是GNU getopt()
扩展名,就不会有任何伤害。