Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Все переменные окружения 
:(
    Опции темы
Bobby
Дата 13.1.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.11.2004
Где: Москва

Репутация: нет
Всего: нет



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

Код

#include <iostream>

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

    return 0;
}


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

PM MAIL WWW ICQ   Вверх
Void
Дата 13.1.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



while (*env) { ... }



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Bobby
Дата 13.1.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.11.2004
Где: Москва

Репутация: нет
Всего: нет



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

while (*env) { ... }

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

И еще один вопрос по этой теме. env является параметром функции main. А можно ли как-нибудь иметь доступ к переменным окружения из другой функции, не передавая параметр env в эту функцию? Именно ко всем переменным окружения, объявленным в системе, а не к отдельным в отдельности (с помощью getenv, например).
PM MAIL WWW ICQ   Вверх
Void
Дата 13.1.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Bobby
Дата 14.1.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.11.2004
Где: Москва

Репутация: нет
Всего: нет



Цитата(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;
}




Это сообщение отредактировал(а) Bobby - 14.1.2006, 00:21
PM MAIL WWW ICQ   Вверх
Void
Дата 14.1.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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

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



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2127 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.