0

我有以下代码:

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)

我的代码 if strcmp(argv[1], "-e") == 0) is not "-e" 工作正常。但是当我把它留在里面时,我的代码只适用于上面的 if 语句为真时。关于为什么会发生这种情况的任何想法?例如:

如果我使用未注释掉的 argv[1] 进行编译:

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

exampleProgram -e < a.txt 有效,但 exampleProgram < a.txt 无效。任何想法为什么?

4

3 回答 3

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;
}
于 2012-12-03T02:11:32.297 回答
1

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

于 2012-12-03T02:11:33.133 回答
0

原因
exampleProgram -e < a.txt有效而 exampleProgram < a.txt无效
是因为当没有参数传递到程序中时,如果是 no argv[1],则它超出了 args 数组的范围。在测试之前你需要做argv[1]的是测试看看是否有那么多参数开始。

例如:

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

  }
}

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

于 2012-12-03T02:14:14.277 回答