在 C++ 中获取环境变量
本文将介绍几种在 C++ 中获取环境变量的方法。
使用 std::getenv
函数访问 C++ 中的环境变量
getenv
是在 C 标准库中实现的符合 POSIX 标准的函数,可以在 C++ 源文件中使用 <cstdlib>
头文件导入。该函数将字符串作为唯一的参数,并搜索与之相等的环境变量名。
环境变量通常用大写字母表示,但 getenv
仍然要求参数字符串不能用小写字母,因为即使它在程序环境中定义了,也不会与变量名匹配。函数返回的是 char*
类型,对应的变量值就存放在这个类型中。
注意,我们将 getenv
的返回值分配给 const char*
变量,因为我们需要确保程序不会修改该位置,否则会导致未定义的行为。
#include <cstdlib>
#include <iostream>
#include <string>
using std::cerr;
using std::cout;
using std::endl;
using std::getenv;
using std::string;
const char *ENV_VAR = "HOME";
int main() {
const char *tmp = getenv("HOME");
string env_var(tmp ? tmp : "");
if (env_var.empty()) {
cerr << "[ERROR] No such variable found!" << endl;
exit(EXIT_FAILURE);
}
cout << "HOME : " << env_var << endl;
exit(EXIT_SUCCESS);
}
输出:
HOME : /home/username
同样重要的是不要将 getenv
函数返回的值直接传递给 std::string
构造函数,因为当 getenv
函数不能计算任何环境变量时,可能会抛出一个分段故障。
这个问题是在 std::string
构造函数代码的实现中引起的,它在下面调用了 std::char_traits::length()
函数。如果将 nullptr
作为参数传递给它,后一个函数将导致未定义的行为。因此,就出现了这样的情况:当找不到环境变量时,getenv
可以返回 nullptr
,如果我们把它传给 string
构造函数,就会形成错误的代码。
#include <cstdlib>
#include <iostream>
#include <string>
using std::cerr;
using std::cout;
using std::endl;
using std::getenv;
using std::string;
const char *ENV_VAR = "HOME";
int main() {
// Erroneous
string env_var(getenv("HOME"));
if (env_var.empty()) {
cerr << "[ERROR] No such variable found!" << endl;
exit(EXIT_FAILURE);
}
cout << "HOME : " << env_var << endl;
exit(EXIT_SUCCESS);
}
使用自定义检查例程来验证有效的环境变量值
在访问环境变量时,最危险的陷阱之一是验证检索的值。请注意,这些变量可能被攻击者在我们的程序范围之外进行操作。因此,需要对这些值进行额外的消毒,以确保程序执行的正确和安全。
这些检查例程主要是依赖于程序的,应该针对每种情况进行不同的处理。在下面的例子中,我们演示了这样的情况:我们假设字符串值中不应该有任何空格,如果有,我们就提取第一个空格字符之前的子字符串。通过这种方式,我们回避了系统环境中任何不规则的输入值。注意,std::find
算法被用来搜索 string
中的字符,如果没有找到指定的 char
,它将返回 string::npos
。
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <string>
using std::cerr;
using std::cout;
using std::endl;
using std::find;
using std::getenv;
using std::string;
const char *ENV_VAR = "HOME";
int main() {
const char *tmp = getenv(ENV_VAR);
string env_var(tmp ? tmp : "");
if (env_var.empty()) {
cerr << "[ERROR] No such variable found!" << endl;
exit(EXIT_FAILURE);
}
// Env Variable Value Sanitization
int pos = env_var.find(' ');
if (pos != string::npos) env_var = env_var.substr(0, pos);
cout << "HOME : " << env_var << endl;
exit(EXIT_SUCCESS);
}
相关文章
如何在 C++ 中实现毫秒级的睡眠
发布时间:2024/01/02 浏览次数:124 分类:C++
-
本文介绍了在 C++ 中使用不同方法暂停程序执行,实现睡眠的方法。本文介绍了在 C++ 中睡眠毫秒的方法。使用 std::this_thread::sleep_for 方法在 C++ 中睡眠
如何在 C++ 中将双精度数四舍五入到整数上
发布时间:2024/01/02 浏览次数:88 分类:C++
-
本文演示了如何在 C++ 中把双精度数四舍五入到整数中。本文将为大家讲解几种在 C++ 中如何将双精度数四舍五入为整数的方法。使用 round() 函数将双精度数四舍五入到整数
如何在 C++ 中以毫秒为单位获取时间
发布时间:2024/01/02 浏览次数:60 分类:C++
-
本文介绍了如何在 C++ 中获取以毫秒为单位的时间。本文将介绍多种 C++ 方法,介绍如何以毫秒为单位获取时间。
如何在 C++ 中把 Char 数组转换为 Int
发布时间:2024/01/02 浏览次数:90 分类:C++
-
本文演示了在 C++ 中把 char 数组转换为 int 类型的方法。本文将介绍将 char 数组转换为 int 类型的 C++ 方法。使用 std::strtol 函数将 char 数组转换为 int 类型
如何在 C++ 中将 ASCII 码转换为字符
发布时间:2024/01/02 浏览次数:183 分类:C++
-
本文介绍了在 C++ 中如何将 ASCII 值转换为 char 的方法。本文将演示关于如何在 C++ 中把 ASCII 值转换为字符的多种方法。在 C++ 中使用赋值运算符将 ASCII 值转换为字符
如何在 C++ 中把十进制转换为二进制
发布时间:2024/01/02 浏览次数:71 分类:C++
-
本文介绍如何在 C++ 中把十进制数转换成二进制数。本文将介绍几种在 C++ 中如何将十进制数转换为二进制表示的方法。在 C++ 中使用自定义定义的函数将十进制数转换为二进制数
如何在 C++ 中把枚举型转换为字符串
发布时间:2024/01/02 浏览次数:138 分类:C++
-
本文演示了如何在 C++ 中把枚举转换为字符串。本文将解释几种在 C++ 中把枚举类型转换为 string 变量的方法。使用 const char*数组将枚举类型转换为字符串
在 C++ 创建一个字典
发布时间:2024/01/02 浏览次数:191 分类:C++
-
本文介绍了如何在 C++ 中创建一个字典。使用初始化列表构造函数在 C++ 中创建字典 在 C++ 标准容器库中,有一个名为 std::map 的字典,它实现了具有唯一键的排序键值对。
如何在 C++ 中将文本追加到文件
发布时间:2024/01/02 浏览次数:95 分类:C++
-
本文介绍了如何用 C++ 将文本追加到文件中的方法。使用 std::ofstream 和 open() 方法将文本追加到文件中