在C / C ++中打印所有环境变量


72

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

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


如何使用system(env)调用env?
维杰

Answers:


117

使环境变量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;
}

13
如果您在Windows中工作,并且拥有编译器,为什么不运行它并查看呢?让我们知道怎么回事。
亚历克斯·布朗

4
尽管得到了广泛支持(我不知道有不支持它的编译器),但不能保证对main使用“ envp”参数,只有“ argc”和“ argv”是保证的。“ envp”还使其对main()本地化。一种更可移植的解决方案是查看几乎每个编译器都提供的“ environ”外部环境(全局)以及getenv()和setenv()函数(这些函数应确保操纵流程环境的完整性)。 。许多实现也提供了putenv()函数,但是此函数可能无法确保环境的完整性。(请参阅文档,注释空间用尽。)
CM

58
#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
您的示例中有一个错误。第一个环境变量被打印两次。

1
您是100%正确的。我已经从0更新我的初始值设置为1
user1602017

4
该解决方案的优点是它不需要在main()中。如果将它放在大型复杂程序的中间,它会很好地工作。谢谢!!
杰夫·泰勒

3
这是posix专用的API。另一方面,getenv是C标准库函数,这意味着它可用于所有C兼容的OS。
andrewrk '16

1
那就是OS X版本中使用的功能/usr/bin/env
nedil '16

15

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


10

您的编译器可能会提供主要功能的非标准扩展,从而提供其他环境变量信息。MS编译器和大多数Unix版本具有以下版本的main:

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

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


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


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

4

在大多数环境中,您可以将main声明为:

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

envp包含所有环境字符串。


2

如果您在Windows操作系统上运行,则也可以调用GetEnvironmentStrings(),它返回以null结尾的字符串的块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.