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

Jac*_*cob 64 c c++

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

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

Ale*_*own 108

环境变量main()可用作envp参数 - 以null结尾的字符串数组:

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

  • 如果你在windows中工作,如果你有一个编译器,为什么不运行它看看?让我们知道怎么回事. (13认同)
  • 虽然广泛支持(我不知道任何不支持它的编译器),但不保证使用main的"envp"参数,只有"argc"和"argv"."envp"也使它成为main()的本地.一个更便携的解决方案是查看几乎每个编译器提供的"environ"extern(全局),以及getenv()和setenv()函数(它们应该确保操作进程环境的完整性) .许多实现还提供了putenv()函数,但此函数可能无法确保环境完整性.(参见文档,用完了评论空间.) (3认同)

use*_*017 53

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案的优点是它不需要在main()中.如果你坚持它是一个庞大而复杂的程序的中间,它工作正常.谢谢!! (3认同)
  • 这是特定于posix的API.另一方面,getenv是一个C标准库函数,这意味着它适用于所有符合C标准的操作系统. (3认同)
  • @andrewrk `getenv()` 不允许迭代所有环境变量,AFAIK。 (3认同)

Dyn*_* Fu 14

我想你应该检查一下environ.使用"man environ".


Ski*_*izz 10

您的编译器可能会为主函数提供非标准扩展,以提供其他环境变量信息.MS编译器和Unix的大多数版本都有这个版本的main:

int main (int argc, char **argv, char **envp)
Run Code Online (Sandbox Code Playgroud)

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


whu*_*nmr 7

LPTCH WINAPI GetEnvironmentStrings(void);
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/ms683187%28VS.85%29.aspx

编辑:仅适用于 Windows。


Ale*_*lex 6

int main(int argc, char **argv, char** env) {
   while (*env)
      printf("%s\n", *env++);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)