2

我正在编写一个简单的程序,它从用户那里获取参数并处理它们。我在 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

谢谢

4

3 回答 3

7
  • 如果您想遍历程序参数以查找终止的空指针,您的外循环应该是

    while (*++argv)
    

    不是

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

    你在你的代码中。

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

    这个

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

    实际上应该是

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

    if (**argv == '-')
    

    很好,但因为它相当于

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

    也许你也应该这样重写它,只是为了与switch.

于 2013-07-07T05:19:48.327 回答
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]);
    }
}
于 2013-07-07T05:27:26.407 回答
0

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

另请参见此处:解析程序参数

于 2013-07-07T05:30:09.577 回答