2010-01-18 20 views

Odpowiedz

84

Zmienne środowiskowe są udostępniane main() jako envp argumentu - null zakończone tablicy ciągów:

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

Czy to działa również w systemie Windows? – andrewrk

+11

Jeśli pracujesz w systemie Windows i jeśli masz kompilator, dlaczego po prostu go nie uruchomisz i nie zobaczysz? Daj nam znać, jak to działa. –

+0

Chociaż jest szeroko obsługiwany (nie znam żadnego kompilatora, który go nie obsługuje), użycie argumentu "envp" w main nie jest gwarantowane, a jedynie "argc" i "argv". "envp" powoduje również, że jest lokalny dla main(). Bardziej przenośnym rozwiązaniem jest spojrzenie na "środowisko" zewnętrzne (globalne), które zapewnia prawie każdy kompilator, a także funkcje getenv() i setenv(), które mają zapewnić integralność manipulowania środowiskiem procesu. . Wiele implementacji zapewnia również funkcję putenv(), ale ta funkcja może nie zapewniać integralności środowiska. (Zobacz dokumentację, brak miejsca na komentarz.) –

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

Myślę, że powinieneś sprawdzić environ. Użyj "man environ".

+4

http://www.opengroup.org/onlinepubs/007908799/xsh/environ.html – ephemient

8

Twój kompilator może dostarczyć niestandardowe rozszerzenia głównej funkcji, która zapewnia dodatkowe informacje o zmiennych środowiskowych. Kompilator MS i większość smaki Unix mieć tę wersję główne:

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

gdzie trzeci parametr jest zmienną środowiskową informacji - wykorzystanie debuggera aby zobaczyć, co format jest - prawdopodobnie null zakończone listę wskaźników smyczkowych.

1

Jeśli używasz systemu operacyjnego Windows, możesz również zadzwonić pod numer GetEnvironmentStrings(), który zwraca blok zakończonych znakiem NUL stringów.

4

W większości środowisk można zadeklarować swoją główną jak:

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

envp zawiera wszystkie sznurki środowiskowe.

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

W twoim przykładzie występuje błąd. Pierwsze środowisko var zostanie wydrukowane dwukrotnie. –

+1

Masz 100% poprawności. Zaktualizowałem początkową wartość i do 1 z 0. – user1602017

+2

Zaletą tego rozwiązania jest to, że nie musi być w main(). Działa to dobrze, jeśli włożysz go w środek dużego i skomplikowanego programu. Dzięki!! –

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