我尝试在程序启动时检查参数,但我有两个问题,不知道如何解决它们。
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])
答案 0 :(得分:2)
这将始终为真
if (sizeof(argc[i + 1]) < 255)
问题是sizeof
运算符不计算字符串的长度,因为需要strlen()
,它会给出参数的大小,在本例中是指针。此外,通常参数名为argv
,argc
是参数计数。
另外,memset()
只有strcpy()
绝对不可能。
答案 1 :(得分:1)
您在看到选项参数-a
或-p
后立即执行此检查:
if(argc > i)
但如果提供了参数i
,并且您已经知道:参数i
是-p
,则情况确实如此。它不验证参数i + 1
是否存在。所以上面的检查是不正确的;它没有告诉你关于参数向量中的以下元素的任何信息。如果没有,当您尝试使用该参数时,您将会出现段错误。
你真的应该考虑使用getopt
。它完成了所有这些工作。