每次我按以下方式运行下面的程序:./a.out -a -b
它运行正常。但是如果选择运行./a.out -a
,我会导致分段错误(核心转储)。有什么方法可以解决这个问题吗?
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (strcmp(argv[2],"-b") == 0)
{...}
}
}
}
答案 0 :(得分:3)
当您使用./a.out -a
运行它时,只有一个参数,那么您不应该执行检查strcmp(argv[2],"-b")
,因为没有第三个参数,并且读取argv[2]
会导致未定义的行为
您可以在执行strcmp(argv[2],"-b")
之前添加额外的检查来解决此问题。
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (strcmp(argv[1],"-a") == 0)
{...
if (argc > 2 && strcmp(argv[2],"-b") == 0)
{...}
}
}
}
这看起来很难看,但它会起作用。
答案 1 :(得分:1)
argc计算所有参数,包括程序的名称。 如果不提供-b参数,则argc等于2