argv [1]给出了段错误

时间:2012-12-03 02:07:36

标签: c++ segmentation-fault argv

我有以下代码:

int main(int argc, char *argv[])
{
  if(strcmp(argv[1],"-e")==0)
  { 
    //perform code
  }

  //code if argv[1] is not "-e"

return 0;
}

当我拿出整个if语句时:

if(strcmp(argv[1], "-e")==0)

我的代码如果strcmp(argv [1],“ - e”)== 0)不是“-e”工作正常。但是当我把它放进去时,我的代码只适用于上面的if语句生成的时候。有关为何会出现这种情况的任何想法例如:

如果我用argv编译[1]没有注释掉:

//示例程序将是可执行文件

exampleProgram -e< a.txt工作但是exampleProgram< a.txt不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

很简单,如果你没有向程序发送任何参数,那么args[1]就不存在了,你试图访问一个未分配的内存位置。

您可以这样做:

int main(int argc, char *argv[])
{
  if(argc > 1 && strcmp(argv[1],"-e")==0)
  { 
    //perform code
  }

  //code if argv[1] is not "-e"

return 0;
}

答案 1 :(得分:1)

argv是一个数组。当您尝试索引到最后一个元素之外的数组时,您会得到段错误。要不超过最后一个元素,请检查argc的值,而argc - 1将是您可以访问的最后一个元素的索引。有关段错误的更多信息,请访问http://en.wikipedia.org/wiki/Segmentation_fault

答案 2 :(得分:0)

原因
exampleProgram -e < a.txt有效 exampleProgram < a.txt没有 是因为当没有参数传递给程序时,其中没有argv[1],它超出了args数组的范围。在测试argv[1]之前你需要做的是测试是否有很多参数可以开始。

例如:

if (argc > 1) {
  if(strcmp(argv[1],"-e")==0) {

  }
}

argc用于保存程序中存在多少个参数,以便您可以在超出范围之前对其进行测试。