Namespaces
Variants

getenv, getenv_s

From cppreference.net
定义于头文件 <stdlib.h>
char * getenv ( const char * name ) ;
(1)
errno_t getenv_s ( size_t * restrict len, char * restrict value,
rsize_t valuesz, const char * restrict name ) ;
(2) (C11 起)
1) 在主机指定的环境列表中搜索名为 name 的环境变量,并返回指向匹配环境变量关联字符串的指针。环境变量的集合及其修改方法由实现定义。
此函数无需保证线程安全。再次调用 getenv ,或调用 POSIX 函数 setenv() unsetenv() putenv() 可能会使先前调用返回的指针失效,或修改先前调用所获字符串。
修改 getenv 返回的字符串会引发未定义行为。
2) (1) 相同,区别在于环境变量的值会被写入用户提供的缓冲区 value (除非该指针为空),且写入的字节数会存储到用户提供的地址 * len (除非该指针为空)。若环境变量未设置,则向 * len 写入零(除非该指针为空),并向 value [ 0 ] 写入 ' \0 ' (除非该指针为空)。此外,在运行时检测到以下错误时会调用当前安装的 约束处理函数
  • name 是空指针
  • valuesz 大于 RSIZE_MAX
  • value 是空指针且 valuesz 不为零
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdlib.h> 前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时,才保证 getenv_s 可用。

目录

参数

name - 用于标识要查找的环境变量名称的以空字符结尾的字符串
len - 指向用户提供位置的指针, getenv_s 将在此存储环境变量的长度
value - 指向用户提供的字符数组的指针, getenv_s 将在此存储环境变量的内容
valuesz - getenv_s 允许写入 dest 的最大字符数(缓冲区大小)

返回值

1) 标识环境变量值的字符串,若未找到该变量则为空指针。
2) 若找到环境变量则返回零,若未找到环境变量或发生运行时约束违规则返回非零值。出现任何错误时,向 * len 写入零值(除非 len 是空指针)。

注释

在POSIX系统中, 环境变量 还可通过全局变量 environ 访问,该变量在 <unistd.h> 中声明为 extern char ** environ ; ,也可通过 main函数 的可选第三参数 envp 访问。

当使用空指针作为 value 参数且将 valuesz 设为零调用 getenv_s 时,其作用是确定容纳完整结果所需缓冲区的尺寸。

示例

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    const char *name = "PATH";
    const char *env_p = getenv(name);
    if (env_p)
        printf("Your %s is %s\n", name, env_p);
}

可能的输出:

Your PATH is /home/gamer/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/share/games

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.22.4.6 getenv 函数 (p: TBD)
  • K.3.6.2.1 getenv_s 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.22.4.6 getenv 函数 (页码: 256-257)
  • K.3.6.2.1 getenv_s 函数 (页码: 440-441)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.22.4.6 getenv 函数 (页码: 352-353)
  • K.3.6.2.1 getenv_s 函数 (页码: 606-607)
  • C99 标准 (ISO/IEC 9899:1999):
  • 7.20.4.5 getenv 函数 (页: 317)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.10.4.4 getenv 函数

参考

C++ 文档 关于 getenv