【问题标题】:Adding even / odd elements in *argv[] to arrays将 *argv[] 中的偶数/奇数元素添加到数组
【发布时间】:2020-10-02 19:04:38
【问题描述】:

我是 C++ 的新手,我正在制作一个简单的程序,它将值和单位作为系统参数,并将它们全部转换为单个单位。命令行执行和输入是这样的:

./unit_conv 3 feet 5 inches centimeters

数值和单位之间用空格隔开,最后一个参数是我要转换成的单位。

我获取输入的方法是在最后一个元素之前将 *argv[] 的所有偶数元素添加到名为“values”的整数数组中,并将所有奇数元素添加到名为“units”的字符指针数组中。以下是我尝试的实现:

if (argc % 2 == 0) {
  char * desiredUnit  = argv[argc - 1];
  int values[argc];
  char * units[argc];

  int j;
  int k;
  for (int i = 1; i < argc; i++) {
    if (i % 2 == 1) {
      values[j] = atoi(argv[i]);
      j++;
    }
    else {
      units[k] = argv[i];
      k++
    }
  }
}

在我上面提到的执行后,我得到以下信息:

Segmentation fault (core dumped)

我知道我的 for 循环中发生了段错误。不过,我看不到该程序如何尝试访问受限内存。我已经被这个卡住了很长一段时间了。

希望我提供了足够的信息,但如果我的问题过于模糊,请告诉我。

谢谢!

【问题讨论】:

  • 你没有初始化jk。根据 C 实现,它们可能是零或完全随机的值。
  • 假设它们是不确定的。如果将它们设置为 0,则不是为了编码员的方便,而是为了隐私。
  • 你试过调试吗?请注意,可变长度数组不是标准 C++,您应该使用 std::vector 代替
  • 现在工作!对我来说这是多么世俗的错误。我认为变量默认初始化为零。
  • 不,在编译时大小未知的地方也应该使用向量,VLA 是非标准的,很容易导致堆栈溢出,向量通过堆分配来帮助防止它们

标签: c++ c arrays segmentation-fault


【解决方案1】:

您是否尝试过使用 STL?

std::vector<std::string> units{};
std::vector<int> values{};

for (std::size_t i {1}; i < argc; ++i) {
    if (i % 2 == 0) {
        units.push_back(std::string{argv[i]});
    } else {
        values.push_back(std::atoi(argv[i]));
    }
}

【讨论】:

  • 一种更清洁的方法。这使得索引计数器 {j} 和 {k} 任意。谢谢艾曼!
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2015-05-11
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多