2011-05-24 80 views
1

我是新来编程,我想添加到一个开关,将采取选项的情况下,如-aa,-aaa,-aaaaaa等,其中除了大小写的情况下,这三种情况中的每一种都可以提供单一功能aC开关问题

我在想......

int option = getopt (argc, argv, "abcd"); 
    switch(option){ 
    case 'a': BLAH = TRUE; 
       break; 
    case 'b': FOO = TRUE; 
       break; 
    case 'c': BAR = TRUE; 
       break; 
    case 'd': BAZ = TRUE; 
       break; 
    } 
    for(int i = 1; i<argc; i++){ 
    if (argv[i][0] == '-' && argv[i][1] == 'a' && argv[i][i+2] == 'a') 
     myOption =TRUE; 
    } 

但将这项工作? 感谢您的阅读。

+0

我的问题是不是使用getopt(),但它是否argv [i] [i + 2] =='a'会做我想做的事 – KufNayr 2011-05-24 03:08:01

回答

1

'aaa'不是整数,不是char,也不是C语言中的任何类型。传递给switch语句的表达式应返回一个整数。所以,switch语句会在那里投诉。

对于非整数比较,例如列出的那些比较,使用if-else应该是好的。

3

getopt_long(3)功能提供了命令行解析到很多程序,通常与这样的调用:

struct option long_options[] = { 
    {"add",   0, 0, 'a'}, 
    {"binary",  0, 0, 'B'}, 
    {"base",  1, 0, 'b'}, 
... 
    {"Optimize",  1, 0, 'O'}, 
    {"preprocess",  0, 0, 'p'}, 
    {NULL, 0, 0, 0}, 
}; 


while ((c = getopt_long(argc, argv, "adf:h::rRVvI:b:BCD:NSm:qQn:XKTWkO:po:", long_options, &o)) != -1) 
{ 
    switch (c) { 
    case 0: 
     PERROR("Assert, in getopt_long handling\n"); 
     display_usage(progname); 
     exit(0); 
     break; 
    case 'a': 
     count++; 
     option = OPTION_ADD; 
     break; 
    case 'd': 
     debug++; 
     skip_read_cache = 1; 
     break; 
/* ... and so forth */ 

您可能能够使用getopt_long(3)扫描输入数组来寻找多个输入(认为addbinary等,从long_options[])映射到一个简短的选项(aB)。

但是,如果您对自己想要完成的任务更具体,可能会有更好的机制。

+0

这就是'getopt_long(3)'而不是'getopt(3)',不是吗?至少,在RHEL 5上,'man 3 getopt'描述了getopt(3)而不是getopt_long(3),但是我的机器上的man 3 getopt_long描述了两者。 – 2011-05-24 03:06:47

+0

@Jonathan,这就是我得到的太快浏览的联机帮助:)我只是很高兴,我一次输入正确...谢谢! – sarnold 2011-05-24 03:08:28

3

不,这可能不起作用。 C中的最佳方式(假设你使用Linux)是使用GNU C库提供的一些getopt函数。如果您只需处理一个或两个长期选项,则还可以使用if..else ifstrcmp()

上次我查看了BSD libc的类似功能(虽然可能有点不同)。

+0

+1简单工具也:) – sarnold 2011-05-24 03:08:53