Kulaxyz
@Kulaxyz
Могу лучше

Как скопировать значение переменной окружения через указатель в СИ?

Здравствуйте! Задание вывести переменные окружения, имена которых короче заданного числа. Для этого я разбиваю каждую переменную на [имя, значение] по символу "=" с помощью strtok. Однако strtok меняет само значение, добавляя в массив NULL. Как мне скопировать значение переменной в формате "имя=значение" в другую переменную, чтобы потом при работе с новой, старая не изменялась. Пробовал через memcpy и не получилось.
void ShortNames(char **arr, int num) 
{
	printf("Значения переменных, у которых имена меньше заданного: \n");
	
	for (char **env = arr; *env != 0; env++)
	{
		char **result = malloc(sizeof(char*) * 1000);
		
		int size = sizeof(env);
				
		char* thisEnv = *env;
		//char* thisEnv = malloc(sizeof(char*) * size);
		//memcpy(thisEnv, *env, sizeof(char*) * size);
		
		split(result, thisEnv, "=");
	
	
		if (strlen(result[0]) <= num)
		{
			printf("%s \n", *env);
		}
	}
}


На данный момент этот код выводит только имена переменных окружения и меняет вообще все переменные окружения.
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как скопировать значение

Для этого надо понимать структуру данных. Структура переменных окружения такова: есть символьный массив содержащий текст всех переменных, и есть массив указателей, содержащий указатели на начало каждой переменной в первом массиве. Копировать указатели из второго массива но не копировать сами переменные бесполезно.

С другой стороны, в этом задании вообще не нужно ничего копировать. И пользоваться strtok тоже не нужно. Нужно искать длину названий переменных. Сделать это можно так:
#include <string.h>

void ShortNames(char **arr, int num)
{
    int i;
    for (i = 0; arr[i]; ++i) {
        int len = strchr(arr[i], '=') - arr[i];
        if (len <= num)
            printf("%.*s\n", len, arr[i]);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
На кой Вам хрен strtok()? переменная окружения - это просто строка. Что мешает найти знак '=' через strchr(), прикинуть единичку и взять strlen() от этой точки? Вот и получили длину :)
(для универсальности кода можно проверять следующий за = символ на isspace(), если совпало, пропускаем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы