2010-01-18 41 views
46

如何获取C和/或C++中所有环境变量的列表?在C/C++中打印所有环境变量

我知道getenv可以用来读取环境变量,但是如何列出它们呢?

+0

怎么样使用系统(ENV)调用ENV? – Vijay 2010-01-18 11:22:48

回答

84

的环境变量提供给main()envp参数 - 字符串的空终止数组:

int main(int argc, char **argv, char **envp) 
{ 
    for (char **env = envp; *env != 0; env++) 
    { 
    char *thisEnv = *env; 
    printf("%s\n", thisEnv);  
    } 
    return 0; 
} 
+0

这是否也适用于Windows? – andrewrk 2016-01-12 05:41:50

+11

如果你在windows下工作,并且你有一个编译器,为什么不直接运行它并看看?让我们知道怎么回事。 – 2016-01-12 23:20:23

+0

虽然广泛支持(我不知道任何不支持它的编译器),但不保证对main使用“envp”参数,只有“argc”和“argv”。 “envp”也使它对main()是本地的。更便携的解决方案是查看几乎每个编译器提供的“environ”extern(global),以及getenv()和setenv()函数(这些函数应该可以确保操作流程环境的完整性) 。许多实现还提供了putenv()函数,但是该函数可能无法确保环境的完整性。 (请参阅文档,注释空间不足。) – 2017-12-04 20:49:30

4
int main(int argc, char* argv[], char* envp[]) { 
    // loop through envp to get all environments as "NAME=val" until you hit NULL. 
} 
14

我想你应该检查environ。使用“man environ”。

+4

http://www.opengroup.org/onlinepubs/007908799/xsh/environ.html – ephemient 2010-01-18 16:21:33

8

您的编译器可能会为提供附加环境变量信息的主函数提供非标准扩展。在MS编译器和大多数UNIX形式是这个版本的主要:

int main (int argc, char **argv, char **envp) 

,其中第三个参数是环境变量的信息 - 使用调试器,看看有什么格式是 - 可能是一个空值终止字符串指针的列表。

1

如果你在Windows操作系统上运行,那么你也可以调用GetEnvironmentStrings(),它返回一个由空字符结尾的字符串块。

4

在大多数环境中,你可以声明主要为:

main(int argc,char* argv[], char** envp) 

envp包含所有环境字符串。

37
#include<stdio.h> 

extern char **environ; 

int main() { 
    int i = 1; 
    char *s = *environ; 

    for (; s; i++) { 
    printf("%s\n", s); 
    s = *(environ+i); 
    } 

    return 0; 
} 
+1

您的示例中存在一个错误。第一个环境变量被打印两次。 – 2014-06-10 11:55:08

+1

你100%正确。我已将i的初始值从0更新为1. – user1602017 2014-07-03 16:03:48

+2

此解决方案的优点是它不需要位于main()中。如果你把它放在一个庞大而复杂的程序的中间,它可以正常工作。谢谢!! – 2015-05-05 01:18:36

5
int main(int argc, char **argv, char** env) { 
    while (*env) 
     printf("%s\n", *env++); 
    return 0; 
}