2010-01-18 40 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; 
}