getenv_s
函数getenv_s
函数用于获取指定环境变量的值。它是 getenv
函数的安全版本,通过额外的参数检查避免了缓冲区溢出的风险。
收起
c
errno_t getenv_s(
size_t *pReturnValue,
char *buffer,
size_t numberOfElements,
const char *varname
);
pReturnValue
:指向一个 size_t
类型变量的指针,用于存储实际复制到 buffer
中的字符数(不包括字符串结束符 '\0'
)。如果环境变量不存在,该值为 0。buffer
:指向用于存储环境变量值的字符数组的指针。numberOfElements
:buffer
数组的大小,即可以容纳的最大字符数(包括字符串结束符 '\0'
)。varname
:指向要获取的环境变量名称的字符串指针。0
。EINVAL
:如果 pReturnValue
、buffer
或 varname
为 NULL
,或者 numberOfElements
为 0。ERANGE
:如果 buffer
太小,无法容纳环境变量的值。#include
#include
#include
int main() {
const char* varName = "PATH";
// 首先尝试获取环境变量所需的缓冲区大小
size_t requiredSize = 0;
errno_t err = getenv_s(&requiredSize, NULL, 0, varName);
if (err != 0 && err != ERANGE) {
// 若不是因为缓冲区过小导致的错误,输出错误信息
fprintf(stderr, "获取环境变量 %s 大小时发生错误,错误码: %d\n", varName, err);
return EXIT_FAILURE;
}
if (requiredSize == 0) {
// 若所需大小为 0,说明环境变量不存在
printf("环境变量 %s 不存在。\n", varName);
return EXIT_SUCCESS;
}
// 为缓冲区分配足够的内存
char* buffer = (char*)malloc(requiredSize);
if (buffer == NULL) {
// 内存分配失败
fprintf(stderr, "内存分配失败,无法获取环境变量 %s 的值。\n", varName);
return EXIT_FAILURE;
}
size_t resultSize;
err = getenv_s(&resultSize, buffer, requiredSize, varName);
if (err == 0) {
printf("环境变量 %s 的值是: %s\n", varName, buffer);
} else {
fprintf(stderr, "获取环境变量 %s 时发生错误,错误码: %d\n", varName, err);
}
// 释放分配的内存
free(buffer);
return EXIT_SUCCESS;
}
_putenv_s
函数_putenv_s
是 C 语言中用于安全地设置或删除环境变量的函数,它是 putenv
函数的安全版本。putenv
函数可能会因为传入不恰当的参数而导致程序出现未定义行为,_putenv_s
通过更严格的参数检查和错误处理机制来避免这些问题。
errno_t _putenv_s(
const char *varname,
const char *value
);
varname
:这是一个指向 const char
类型的指针,代表要设置或删除的环境变量的名称。此名称不能包含等号(=
),如果包含则会导致错误。value
:同样是指向 const char
类型的指针,代表要赋给环境变量的值。若将其设为 NULL
,则该函数会执行删除指定环境变量的操作。0
。EINVAL
:当 varname
为 NULL
或者 varname
中包含等号(=
)时会返回此错误码。ENOMEM
:表示系统内存不足,无法完成环境变量的设置操作。#include
#include
#include
#define MAX_BUFFER_SIZE 1024
int main() {
const char* varName = "MY_TEST_VARIABLE";
const char* varValue = "This is a test value";
// 设置环境变量
errno_t err = _putenv_s(varName, varValue);
if (err == 0) {
printf("成功设置环境变量 %s 为 %s\n", varName, varValue);
} else {
if (err == EINVAL) {
fprintf(stderr, "设置环境变量 %s 失败,错误原因:变量名无效(可能为 NULL 或包含等号),错误码: %d\n", varName, err);
} else if (err == ENOMEM) {
fprintf(stderr, "设置环境变量 %s 失败,错误原因:系统内存不足,错误码: %d\n", varName, err);
} else {
fprintf(stderr, "设置环境变量 %s 失败,未知错误,错误码: %d\n", varName, err);
}
return EXIT_FAILURE;
}
// 获取并打印环境变量的值
char buffer[MAX_BUFFER_SIZE];
size_t resultSize;
err = getenv_s(&resultSize, buffer, sizeof(buffer), varName);
if (err == 0) {
if (resultSize > 0) {
printf("环境变量 %s 的值是: %s\n", varName, buffer);
} else {
printf("环境变量 %s 不存在。\n", varName);
}
} else {
if (err == EINVAL) {
fprintf(stderr, "获取环境变量 %s 时发生错误,错误原因:参数无效,错误码: %d\n", varName, err);
} else if (err == ERANGE) {
fprintf(stderr, "获取环境变量 %s 时发生错误,错误原因:缓冲区太小,错误码: %d\n", varName, err);
} else {
fprintf(stderr, "获取环境变量 %s 时发生错误,未知错误,错误码: %d\n", varName, err);
}
return EXIT_FAILURE;
}
// 删除环境变量
err = _putenv_s(varName, NULL);
if (err == 0) {
printf("成功删除环境变量 %s\n", varName);
} else {
if (err == EINVAL) {
fprintf(stderr, "删除环境变量 %s 失败,错误原因:变量名无效(可能为 NULL 或包含等号),错误码: %d\n", varName, err);
} else {
fprintf(stderr, "删除环境变量 %s 失败,未知错误,错误码: %d\n", varName, err);
}
return EXIT_FAILURE;
}
// 再次尝试获取已删除的环境变量的值
err = getenv_s(&resultSize, buffer, sizeof(buffer), varName);
if (err == 0) {
if (resultSize > 0) {
printf("环境变量 %s 的值是: %s\n", varName, buffer);
} else {
printf("环境变量 %s 不存在,删除操作成功验证。\n", varName);
}
} else {
if (err == EINVAL) {
fprintf(stderr, "再次获取环境变量 %s 时发生错误,错误原因:参数无效,错误码: %d\n", varName, err);
} else if (err == ERANGE) {
fprintf(stderr, "再次获取环境变量 %s 时发生错误,错误原因:缓冲区太小,错误码: %d\n", varName, err);
} else {
fprintf(stderr, "再次获取环境变量 %s 时发生错误,未知错误,错误码: %d\n", varName, err);
}
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
调用 _putenv_s
函数将 MY_TEST_VARIABLE
环境变量的值设置为 This is a test value
。通过判断返回的 errno_t
类型错误码 err
来确定操作是否成功。若失败,根据不同的错误码输出详细的错误信息,如变量名无效(EINVAL
)或系统内存不足(ENOMEM
)等。
使用 getenv_s
函数获取刚设置的环境变量的值。同样根据返回的错误码判断操作结果,若成功且 resultSize
大于 0 则输出环境变量的值;若为 0 则表明环境变量不存在。若失败,针对不同错误码(如 EINVAL
表示参数无效、ERANGE
表示缓冲区太小)输出相应错误信息。
再次调用 _putenv_s
函数,将第二个参数设为 NULL
来删除 MY_TEST_VARIABLE
环境变量。根据返回的错误码判断删除操作是否成功,失败时给出详细错误提示。
再次使用 getenv_s
函数尝试获取该环境变量的值。若 resultSize
为 0,说明环境变量已被成功删除;若获取过程出现错误,根据不同错误码输出对应的错误信息,确保程序的健壮性和可维护性。
getenv_s
和 _putenv_s
是 Microsoft 特定的安全版本函数,主要用于 Windows 平台。在其他平台(如 Linux、macOS)上,标准的 getenv
和 putenv
函数更为常用。不过,你可以通过手动进行边界检查来实现类似的安全功能。getenv_s
时,如果不确定环境变量值的大小,建议先调用一次该函数,将 buffer
参数设为 NULL
,numberOfElements
设为 0,以获取所需的缓冲区大小,然后再分配足够的内存。使用完动态分配的内存后,要记得使用 free
函数释放,避免内存泄漏。#include
#include
int main(void)
{
//C语言中环境变量的访问
char buffer[512] = { 0 };
size_t buffer_size = sizeof(buffer);
errno_t err = getenv_s(&buffer_size, buffer, buffer_size, "PATH");
if (err == 0) {
printf("PATH: %s\n", buffer);
}
else {
return -1;
}
errno_t err2 = _putenv_s("PATH", "Value");
if (err2 == 0) {
printf("success!");
}
else {
return -1;
}
return EXIT_SUCCESS;
}