getenv, getenv_s

来自cppreference.com
< c‎ | program
在标头 <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(除非它为 NULL),而且将写入的字节数存储于用户提供的位置 *len(除非它为 NULL)。若环境变量未设置于环境中,则 *len 会被写入零(除非是 NULL),且 '\0' 会被写入 value[0](除非是 NULL)。另外,在运行时检测下列错误并调用当前安装的制约处理函数
  • name 是空指针
  • valuesz 大于 RSIZE_MAX
  • value 是空指针且 valuesz 非零
同所有边界检查函数,getenv_s,仅若实现定义 __STDC_LIB_EXT1__ 且用户在包含 <stdlib.h> 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

name - 标识要查找的环境变量名称的空终止字符串
len - 指向用户提供的位置,getenv_s 将会在其中存储环境变量的长度
value - 指向用户提供的字符数组,getenv_s 将会在其中存储环境变量内容
valuesz - 允许 getenv_s 对目标写入的最大字节数(缓冲区大小)

返回值

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 The getenv function (第 TBD 页)
  • K.3.6.2.1 The getenv_s function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.22.4.6 The getenv function (第 256-257 页)
  • K.3.6.2.1 The getenv_s function (第 440-441 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.22.4.6 The getenv function (第 352-353 页)
  • K.3.6.2.1 The getenv_s function (第 606-607 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.20.4.5 The getenv function (第 317 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.10.4.4 The getenv function

参阅