检查参数

时间:2016-01-14 16:20:47

标签: c parameters

我尝试在程序启动时检查参数,但我有两个问题,不知道如何解决它们。

1。问题(已解决)

当我运行程序时:./server -a SOMEADRESS -p我得到了Unauthorized access to memory (SIGSEGV)。但是,如果我使用-a SOMEADRESS --a SOMEADRESS fff运行它,则会打印来自else的错误消息。

2。问题

我想获取address并将其复制到char数组中。但它看起来好像没有在该阵列中复制。

我的支票代码:

int i = 0;
for(i = 1; i < argc; i++)
{
    if(strcmp("-h", argv[i]) == 0)
    {
        printf("Some help"0;
        exit(0);
    }
    else if(strcmp("-a", argv[i]) == 0)
    {
        if(argc > i)
        {
            if(strlen(argv[i + 1]) < 255)
            {
                //memset(adresa, '\0', sizeof(adresa));
                strcpy(argv[i + 1], adresa);
                printf("Zadana adresa %s\n", argv[i + 1]);

                i++;
                continue;
            }
            else
            {
                printf("Adresa je prilis dlouha (> 255)\n");
                exit(0);
            }
        }
        else
        {
            printf("Parametry jsou ve spatnem tvaru\n");
        }
    }
    else if(strcmp("-p", argv[i]) == 0)
    {
        if(argc > i)
        {
            int inPort = atoi(argv[i + 1]);
            if(inPort > 0)
            {
                if(inPort <= 65535)
                {
                    port = inPort;
                    printf("Zadany port %d\n", port);

                    i++;
                    continue;
                }
                else
                {
                    printf("Zadany port neni ve spravnem rozsahu\n");
                    exit(0);
                }
            }
            else
            {
                printf("Zadany port neni cislo\n");
                exit(0);
            }
        }
        else
        {
            printf("Parametry jsou ve spatnem tvaru\n");
            exit(0);
        }
    }
    else
    {
        printf("Parametry jsou ve spatnem tvaru\n");
        exit(0);
    }
}

看起来很长,但这是因为很多if

和错误消息:

sk1x1@sk1x1-VirtualBox:~/Plocha/tt$ ./server -a adress -p
4, 1
Zadana adresa 
4, 3
Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])

2 个答案:

答案 0 :(得分:2)

这将始终为真

if (sizeof(argc[i + 1]) < 255)

问题是sizeof运算符不计算字符串的长度,因为需要strlen(),它会给出参数的大小,在本例中是指针。此外,通常参数名为argvargc参数计数

另外,memset()只有strcpy()绝对不可能。

答案 1 :(得分:1)

您在看到选项参数-a-p后立即执行此检查:

if(argc > i)

但如果提供了参数i,并且您已经知道:参数i-p,则情况确实如此。它不验证参数i + 1是否存在。所以上面的检查是不正确的;它没有告诉你关于参数向量中的以下元素的任何信息。如果没有,当您尝试使用该参数时,您将会出现段错误。

你真的应该考虑使用getopt。它完成了所有这些工作。