c++ - 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 和 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 提供,因此您应该检查操作系统的手册页以确保正确使用它。
推荐阅读
- cmd - 使用 Windows findstr 列出不包含字符串的文件
- c++ - 将 :: 放在命名空间名称之前是什么意思?
- python - (Python)关于以下问题,选项(A)和选项(C)有什么区别?
- java - TableView 列不显示整数值。(Java 外汇)
- angular - Angular:如何路由来自同一组件的参数?
- windows - 在另一个特定应用程序启动后关闭一个应用程序的批处理文件
- java - jBoss 6 中不同托管服务器之间是否共享连接池?
- python - 在 Tensorflow 中重用计算的常量值
- angular - 外化角分量
- javascript - 如何验证动态数组中的文本字段