【问题标题】:How to copy portions of an array into another array如何将数组的一部分复制到另一个数组中
【发布时间】:2015-08-26 17:58:16
【问题描述】:

早上好!我需要从位置 2 开始将一个数组的一部分复制到另一个数组中并消耗所有剩余的值。第一个数组是“char**”类型的“argv”数组,但第二个数组需要是“const char*”类型的。在 C++ 中似乎有两种方法可以做到这一点 - std:copy 和 memcpy。由于这两个数组的类型不同,哪种情况更适合处理这种情况?示例是什么样的?

【问题讨论】:

  • 您不应该将argv 数组中的条目追加到目标字符串中吗?这对我来说听起来更合乎逻辑。
  • 一些你尝试过的代码会很好。
  • @LightnessRacesinOrbit 好你提醒我,大家晚安! :)
  • @JoachimPileborg: 塔塔;p

标签: c++ arrays


【解决方案1】:

还是我误解了你的问题?你有一个包含空格分隔的“参数”的字符串并且应该创建一个 argv 样式的数组?

那么我建议将std::copystd::istringstreamstd::istream_iteratorstd::back_inserter 一起使用,如下所示:

std::vector<std::string> args;
std::istringstream istr(string_containing_args);

std::copy(std::istream_iterator<std::string>(istr),
          std::istream_iterator<std::string>(),
          std::back_inserter(args));

现在你有了一个字符串向量,类似于argv 数组。这里的问题是您似乎想要一个正确的 argv 样式数组,以传递给例如execv。这可以通过transforming将向量转换成另一个向量来完成:

std::vector<const char*> execv_args(args.size());
std::transform(std::begin(args), std::end(args),
               std::begin(execv_args),
               [](const std::string& s){ return s.c_str(); });
execv_args.push_back(nullptr);

重要提示:args向量的生命周期必须超过execv_args数组的生命周期,否则指针将失效。

现在可以使用最终向量,例如

execv(execv_args[0], &execv_args[1]);

【讨论】:

  • 我相信他是从一个字符串数组(来自argv)开始,并希望将其中一些传递给execv(),而不是从一个空格分隔的参数字符串开始。
  • @mattnewport 这正是我想要做的!该软件现在将与您对答案的最后回复一起编译,所以我正在快速测试一些东西......
【解决方案2】:

在 C++ 中使用 memcpy() 的充分理由很少。如果我理解您的要求正确,这里有一个使用std::copy() 的示例。

vector<char*> args(argc - 2);
copy(argv + 2, argv + argc, begin(args));

Live example.

【讨论】:

  • 没有解释的两行代码转储,尤其是带有指针容器的代码,是有害的,没有用处。
  • @LightnessRacesinOrbit 懒惰的问题得到懒惰的答案。
  • @matttnewport 感谢您的回答!当我在我的 'execv' 调用中传递 'args' 数组时,我收到一个错误“错误:无法将 'std::vector' 转换为 'char* const*' for argument '2' to 'int execv(const char*, const* char*, ...)"
  • @user1646428:你的问题在哪里说你正在使用execv
  • @lightness 帖子没有提及,但我确实说明了这两个数组应该由什么组成。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 2010-10-18
  • 1970-01-01
  • 2015-06-17
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多