用于解析选项的switch case

时间:2013-07-07 05:10:34

标签: c pointers

我正在编写一个简单的程序,它从用户那里获取参数并处理它们。 我在argv中的参数是二维数组。但是当我运行程序时,我得到垃圾值和分段错误错误。我已经尝试使用argc作为终止条件并且它有效。但我想只使用指针。 指针在这里做错了什么。

#include<stdio.h>
int main( int argc, char *argv[])
{
    while (++(*argv))
    {
        if ( **argv == '-' )
        {
            switch (*argv[1])  
            {
                default:
                    printf("Unknown option -%c\n\n", (*argv)[1]);
                    break;
                case 'h':
                    printf("\n option h is found");
                    break;
                case 'v':
                    printf("option V is found");
                    break;
                case 'd':
                    printf("\n option d is found");
                    break;
            }
        }
        printf("\n outside while : %s", *argv);
    }
}

程序运行:

./a.out -h -v -d

谢谢

3 个答案:

答案 0 :(得分:6)

  • 如果要遍历查找终止空指针的程序参数,则外部循环应为

    while (*++argv)
    

    不是

    while (++*argv) // <- incorrect!
    

    你的代码中有。

  • 您的switch表达式写错了。虽然您的意图很明确,但您的实现会忽略运算符优先级。

    这个

    switch (*argv[1])  { // <- incorrect!
    

    实际应该是

    switch ((*argv)[1])  {
    
  • 之前的if

    if (**argv == '-')
    

    很好,但因为它相当于

    if ((*argv)[0] == '-') // <- better
    

    也许您应该以这种方式重写它,只是为了与switch保持一致。

答案 1 :(得分:2)

您的最终问题是运营商优先级。当没必要时,不要试图聪明。 *运算符无法正常工作。我使用[0]重写了您的代码,现在它可以正常工作:

#include <stdio.h>

int main(int argc, char *argv[])
{
    while ((++argv)[0])
    {
            if (argv[0][0] == '-' )
            {
                    switch (argv[0][1])  {

                            default:
                                    printf("Unknown option -%c\n\n", argv[0][1]);
                                    break;
                            case 'h':
                                    printf("\n option h is found");
                                    break;
                            case 'v':
                                    printf("option V is found");
                                    break;
                            case 'd':
                                    printf("\n option d is found");
                                    break;
                    }
            }

            printf("\n outside while : %s", argv[0]);
    }
}

答案 2 :(得分:0)

argv是一个字符串数组。 argv[0]是程序名称,在您的情况下为a.out。您的选项从argv[1]开始。因此,您需要将argv从1迭代到argc-1以获取选项。

另见:Parsing Program Arguments