迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

在 C++ 中获取环境变量

作者:迹忆客 最近更新:2024/01/02 浏览次数:

本文将介绍几种在 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);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 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() 方法将文本追加到文件中

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便