You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用argv时出现Segmentation Fault问题及相关疑问

命令行参数处理的段错误问题及解决

初始代码与报错

我最初写了这段代码:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;

  for (int i = 1; i < argc; i++) {
      args.push_back({ argv[i] });
  }
  std::string dateString = args[1];

return 0;
}

执行std::string dateString = args[1];时触发了Segmentation Fault错误。

需求说明

我的目标是通过./myalgorithm 2022-09-01这样的命令传入日期参数,把argv[1]里的日期转成std::string,再拆分出年、月、日做计算,原本打算用string.substr()实现:

int year = stoi(mystring.substr(0,4));
int month = stoi(mystring.substr(6,2));
int day = stoi(mystring.substr(9,2));

可正常运行的修改版本

改成下面的代码后就能正常运行了:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;
  for (int i = 1; i < argc; i++) {
      args.push_back({ argv[i] });
  }

  for (auto dateString: args) {
      double year = stoi(dateString.substr(0,4));
      double month = stoi(dateString.substr(5,2));
      double day = stoi(dateString.substr(8,2));
      std::cout << year << std::endl;
      std::cout << month << std::endl;
      std::cout << day << std::endl;
  }

  return 0;
}

疑问

我搞不懂为什么一定要用循环把所有参数存入vector,而不能直接这么写:

std::vector<std::string> args;
args.push_back({ argv[1] });

最终修正代码

最后我改成了这个版本,能正常运行:

int main(int argc, char * argv[]) {

  std::vector<std::string> args;
  if (argc > 1){
    args.push_back({ argv[1] });
  }
  for (auto dateString: args) {
      int year = stoi(dateString.substr(0,4));
      int month = stoi(dateString.substr(5,2));
      int day = stoi(dateString.substr(8,2));
      int gpsweek = GPSweek(year, month, day);
      printf("%d\n", gpsweek);
  }
  return 0;
}

内容的提问来源于stack exchange,提问作者IceCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:31:13