为什么我的if语句会出现seg错误?

时间:2016-12-09 18:40:25

标签: c++ segmentation-fault

我想读一个文件并计算单词。我希望它设置为所以我可以使用命令行,或者,如果在命令行上没有输入文件,则触发将获取文件名并读取它的if语句,然后计算单词。如果我在命令行中输入文件名,它就可以工作,但是如果我不使用它就会出错。这是代码:

int main(int argc, char **argv)
{
   char file[75];
   if (argc < 2)
   {
      cout << "Please enter the filename: ";
      cin >> file;
      strcpy(argv[1], file);
   }
   string content;
   ifstream inFile(argv[1]);
   int count = 0;
   while (inFile >> content)
      count++;
   inFile.close();
   display(count, argv);
   return 0;
}

2 个答案:

答案 0 :(得分:3)

您不应该修改argv的数据,特别是超出范围。你的逻辑应该相反:

   char file[75];
   if (argc < 2)
   {
      cout << "Please enter the filename: ";
      cin >> file;
   } else
      strcpy( file, argv[1] );
   string content;
   ifstream inFile(file);

但您最好还将std::string用于变量file

同样cin >>只输入单词(不包括空格符号),但文件名可以包含它们,因此如果将cin.getline( file )更改为{{1},最好使用std::getline( cin, file )file }}

答案 1 :(得分:1)

如果条件为真,即argc确实小于2,则一般情况下argc等于1,并且根据C标准argv[argc]等于{{ 1}}。

因此,本案例中的程序具有未定义的行为。

在任何情况下,将字符串复制到argv [n]是个坏主意,其中n是某个索引,因为源字符串可能大于目标字符串。

您可以使用反向方法将NULL复制到argv[1]