我正在尝试使用switch
和getopt()
在命令行中解析参数。结构非常简单:我有一个makefile
,一个.c
和一个.h
文件。这是我第一次使用switch,所以我可能会犯一些基本的错误。我使用此链接作为切换指南
link text
和
link text
如果您发现任何基本错误,请告诉我。
生成文件:
make:lunar
lunar: lunar.o
gcc -Wall -std=c99 -g -o lunar lunar.o -lm
lunar.o: lunar.c lunar.h
gcc -Wall -std=c99 -g -c lunar.c
clean:
-rm -f *.o lunar core
/////////////////////////////////////
lunar.c
int main (int argc, char *argv[]){
int i;
int c = 0;
int gravity = 0;
int thrust = 0;
opterr = 0;
while ((c = getopt (argc, argv, "gtf:")) != -1)
switch (c){
case 'g':
gravity = argv[optind];
break;
case 't':
thrust = argv[optind];
break;
case 'f':
argument = argv[optind];
break;
case '?':
if (optopt == 'c')
fprintf(stderr, "Option -%c requires
an argument.\n", optopt);
else if (isprint (optopt))
fprintf (stderr, "Unknown option
`-%c'.\n", optopt);
else
fprintf (stderr, "Unknown option
character `\\x%x'.\n",
optopt);
return 1;
defult:
abort ();
}
printf ("gravity is %d and thrust is %d.\n",
gravity, thrust);
for (int index = optind ; index < argc ; index++ ){
printf ("Non-option argument %s\n", argv[index]);
return 0;
}
}
///////////////////////////////////
lunar.h
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <assert.h>
#define MAX_WORD 256
答案 0 :(得分:4)
不要忘记'default
'中有'a' - 您刚刚用(未使用过的)标签defult
标记了该代码,而不是将该开关设为默认情况
目前尚不清楚为什么你认为optopt
可能是'c',或者当它是'c'时应该特别对待;它可能是早期版本的宿醉。
您正在处理'g'和't'选项,就像它们接受参数一样,但是对getopt()
的调用不会在它们之后列出冒号。如果要相信切换,则需要参数为"g:t:f:"
。
此外,您应该使用名为char *
的{{1}},而不是尝试使用optarg
。在循环完成后使用argv[optind]
来处理额外的('文件名')参数。
此外,由于optind
和gravity
是整数,因此您需要将字符串转换为整数。简单的方法(主要忽略可能的错误)是:
thrust
如果要进行错误处理,请调用函数进行检查和错误报告。
我建议在gravity = atoi(optarg);
语句周围或switch
语句的主体周围添加大括号:
while
这不是绝对必要的,但是(IMNSHO)更容易阅读带有额外括号的代码。对于单行声明,我没有问题;但对于像开关这样的复杂语句,我建议使用额外的大括号。
“while ((c = getopt(argc, argv, "g:f:t:")) != -1)
{
switch (c)
{
...
}
}
”应该在return 0;
循环之外。此时,循环在第一个非选项参数上停止。
makefile基本上没问题。最后,你将使用更多的宏和更多的编译警告标志,但我发现编译器也会发现的唯一问题是默认情况下的拼写错误以及字符串未转换为整数。
for