首页 > 解决方案 > C++:遍历字符串向量并使用 putenv 的索引

问题描述

我有一个字符串向量,它是通过解析配置文件创建的。所有字符串的格式都应为key=value. 我想遍历向量,并使用 putenv 函数将环境变量设置为键值对。

编码:

for(auto it = settings.begin(); it != settings.end(); it++) {
      try {
         auto i = it - settings.begin();
         cout << i << endl;
         putenv(settings.at(i));
      } catch (...) {
         cout << "Config is not in the format key=value ... please correct" << endl;
      }
   }

这会引发错误:

cannot convert ‘__gnu_cxx::__alloc_traits<std::allocator<std::basic_string<char> > >::value_type {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘int putenv(char*)’

我对 C++ 很陌生,所有这些变量类型和指针都让我感到困惑。

标签: c++vectoriterator

解决方案


您正在混合 C 和 C++ 的东西。

  • 您的向量包含 C++ 字符串,std::string.
  • putenv是一个“旧”函数,需要一个指向char缓冲区的指针,即一个 C 字符串。

幸运的是,std::string很容易获得其中之一

putenv(settings.at(i).c_str());
//                   ^^^^^^^^

但是,那里仍然存在问题。putenv获取你给它的缓冲区的“所有权”,并期望它“永远”持续下去。你的不会;它只会在std::string被修改或销毁之前一直存在。还不够好!

按照惯例,我们在这里使用 C来分配缓冲区strdup的副本。char然后putenv(或操作系统)有责任在以后释放它。

putenv(strdup(settings.at(i).c_str()));
//     ^^^^^^^                      ^

由于putenv不在 C 或 C++ 标准中,而是由 POSIX 提供,因此您应该检查操作系统的手册页以确保正确使用它。


推荐阅读