Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Нужна помощь с лабой...(=

Задание: создайте программу, которая будет производить проверку, установлена ли указанная с терминала переменная окружения; если она не установлена, выдавать приглашение на ее установку и устанавливать заданное с терминала значение...

Я думал как сделать:

1. ввод с терминала значения. Это значение записать как строку.

2. командой getenv сделать проверку значения, если никакого значения нет, то использовать команду putenv. Если есть, то просто вывести значение переменной окружения.

3. вводить значение и командой putenv записывать его в качестве значения перменной, имя которой введено как значение в пункте 1. Но putenv вообще с динамической памятью плохо работает, а по идее нужна динамическая строка вида par[1]=par[2].

В общем не знаю как сделать установку нового значения в данном случае... Надеюсь на Вашу помощь...

Опубликовано

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

char buf[10240]="";

char* ptr;

fgets(buf,sizeof(buf),stdin);

while(*buf && buf[strlen(buf)-1] <= 32)

buf[strlen(buf)-1]=0;

if(buf[0] == 0){

fprintf(stderr,"Invalid name\n");exit(EXIT_FAILURE);}

if((ptr=getenv(buf)) != NULL){

printf("Already in environment" "%s\n",ptr);exit(EXIT_SUCCESS);

}

ptr = buf + strlen(buf);

if(ptr >= buf+sizeof(buf)-2){

fprintf(stderr,"Name too long. Unable to add\n");

exit(EXIT_FAILURE);

}

*ptr++='=';

fgets(ptr,buf+sizeof(buf)-ptr,stdin);

while(*ptr && ptr[strlen(ptr)-1] <= 32)

ptr[strlen(ptr)-1]=0;

putenv(strdup(buf));

}

Мы читаем строку из stdin. Мы игнорируем EOF, т.к. ставим buf в "". Если getenv возврашает не NULL, мы выводим это значение. Также мы отсекаеи завершающие \nы,\rы и ' ' если они там оказались.

Далее мы ставим указатель на последний байт строки, проверяем есть ли место для '=', читаем из STDIN еще одну строку, опять игнорируем EOF(если произоцдет - создастся переменная со значением ""), пихаем в env копию статической переменной. putenv плохо работает со статической памятью, а с димнамической... тоже плохо(free()ть кто будет? exit()?). Вроде так.

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...