Jak uzyskać listę wszystkich zmiennych środowiskowych w C i/lub C++?Drukowanie wszystkich zmiennych środowiskowych w C/C++
Wiem, że getenv
można użyć do odczytu zmiennej środowiskowej, ale jak mam je wszystkie wyświetlić?
Jak uzyskać listę wszystkich zmiennych środowiskowych w C i/lub C++?Drukowanie wszystkich zmiennych środowiskowych w C/C++
Wiem, że getenv
można użyć do odczytu zmiennej środowiskowej, ale jak mam je wszystkie wyświetlić?
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;
}
Czy to działa również w systemie Windows? – andrewrk
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. –
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.) –
int main(int argc, char* argv[], char* envp[]) {
// loop through envp to get all environments as "NAME=val" until you hit NULL.
}
Myślę, że powinieneś sprawdzić environ
. Użyj "man environ".
http://www.opengroup.org/onlinepubs/007908799/xsh/environ.html – ephemient
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.
LPTCH WINAPI GetEnvironmentStrings (void);
http://msdn.microsoft.com/en-us/library/ms683187%28VS.85%29.aspx
EDIT: działa tylko w systemie Windows.
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.
W większości środowisk można zadeklarować swoją główną jak:
main(int argc,char* argv[], char** envp)
envp zawiera wszystkie sznurki środowiskowe.
#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;
}
W twoim przykładzie występuje błąd. Pierwsze środowisko var zostanie wydrukowane dwukrotnie. –
Masz 100% poprawności. Zaktualizowałem początkową wartość i do 1 z 0. – user1602017
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!! –
int main(int argc, char **argv, char** env) {
while (*env)
printf("%s\n", *env++);
return 0;
}
jak o wywołanie env użyciu systemu (ENV)? – Vijay