Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Все переменные окружения


Автор: Bobby 13.1.2006, 00:48
Здравствуйте!
В программе хочу вывести список всех переменных окружения. Пытаюсь сделать так:

Код

#include <iostream>

int main(int argc, char *argv[], char *env[])
{
    while (env)
    {
        cout << *env << endl;
        env++;
    }

    return 0;
}


Переменные выводятся, но потом вылетает ошибка "Segmentation Fault". Видимо, выхожу за пределы массива env, но как это отследить?

Автор: Void 13.1.2006, 01:13
while (*env) { ... }

Автор: Bobby 13.1.2006, 23:20
Цитата(Void @ 13.1.2006, 01:13 Найти цитируемый пост)

while (*env) { ... }

Спасибо, все прекрасно работает.

И еще один вопрос по этой теме. env является параметром функции main. А можно ли как-нибудь иметь доступ к переменным окружения из другой функции, не передавая параметр env в эту функцию? Именно ко всем переменным окружения, объявленным в системе, а не к отдельным в отдельности (с помощью getenv, например).

Автор: Void 13.1.2006, 23:25
Есть функция WinAPI GetEnvironmentStrings. Если нужно не под винды, то не знаю, честно говоря.

Автор: Bobby 14.1.2006, 00:19
Цитата(Void @ 13.1.2006, 23:25 Найти цитируемый пост)

Если нужно не под винды, то не знаю, честно говоря

Хорошо бы под любую операционную систему smile Пока у меня такой код - может, кому пригодится:
Код
#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

map<string, string> env_vars;

vector<string> explode(char sep, string st)
{
    int old_pos=0, pos=0;
    vector<string> res;

    while ((pos = st.find_first_of(sep, old_pos)) != -1)
    {
        res.push_back(st.substr(old_pos, pos-old_pos));
        old_pos = pos + 1;
    }

    res.push_back(st.substr(old_pos));
    return res;
}

int get_env(char **env)
{
    vector<string> pair(2);
    int num_of_vars = 0;

    while (*env)
    {
        num_of_vars++;
        pair = explode('=', *env);
        env_vars[pair.at(0)] = pair.at(1);
        env++;
    }
    return num_of_vars;
}

int main(int argc, char *argv[], char *env[])
{
    get_env(env);

    cout << env_vars["OS"];   /* у меня выводит "Windows_NT" */

    return 0;
}



Автор: Void 14.1.2006, 00:34
Неплохое решение smile Я хотел было предложить подобную таблицу, но подумал, что критично будет изменение среды во время работы приложения.

Одно замечание:
Код
vector<string> explode(char sep, string st)

Вот так будет лучше:
Код
pair<string> explode(char sep, const string &st)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)