Проблема в том, что у вас нет метаинформации для ссылки на элементы структуры во время выполнения (что-то вроде structVar. $ ElementName = ..., где $ ElementName - это не имя элемента, а переменная (char?), Содержащая элемент имя, которое следует использовать).
Мое решение было бы добавить эту метаинформацию.
Это должен быть массив со смещением элементов в структуре.
Решение Quick-n-Dirty: вы добавляете массив со строками, полученный код должен выглядеть следующим образом:
const char * wordlist[] = {"pc","gnd","ag","prl_id","fc"};
const int offsets[] = { offsetof(mystruct, pc), offsetof(mystruct, gnd), offsetof(mystruct, ag), offsetof(mystruct, prl_id), offsetof(mystruct, fc)};
const int sizes[] = { sizeof(mystruct.pc), sizeof(mystruct.gnd), sizeof(mystruct.ag), sizeof(mystruct.prl_id), sizeof(mystruct.fc)}
чтобы ввести что-то, вы бы хотели что-то вроде этого:
index = 0;
while (strcmp(wordlist[index], key) && index < 5)
index++;
if (index <5)
memcpy(&mystructvar + offsets[index], &value, sizes[index]);
else
fprintf(stderr, "Key not valid\n");
Этот цикл для вставок может быть дорогостоящим, если у вас большие структуры, но C допускает индексацию массива со строками. Но информатика нашла решение этой проблемы: идеальные хеши.
Так что потом это будет выглядеть так:
hash=calc_perf_hash(key);
memcpy(&mystruct + offsets[hash], &value, sizes[hash]);
Но как получить эти совершенные хеш-функции (я назвал это calc_perf_hash)?
Для этого существуют алгоритмы, в которых вы просто вводите свои ключевые слова, и функции выходят, и, к счастью, кто-то даже запрограммировал их: ищите инструмент / пакет "gperf" в вашей любимой ОС / дистрибутиве.
Там вы просто вводите 6 имен элементов, и он выводит вам готовый к использованию C-код для идеальной хэш-функции (по умолчанию генерирует функцию "hash", которая возвращает хэш, и функцию "in_word_set", которая решает, является ли данная ключ находится в списке слов).
Поскольку хэш находится в другом порядке, вы, конечно, должны инициализировать массивы offsetof и size в порядке хэшей.
Другая проблема, с которой вы столкнулись (и которую другие ответы не учитывают), - это преобразование типов. Остальные делают задание, у меня есть (не лучше) memcopy.
Здесь я бы предложил вам изменить массив размеров на другой:
const char * modifier[]={"%i","%c", ...
Где каждая строка описывает модификатор sscanf для чтения. Таким образом, вы можете заменить назначение / копию на
sscanf(valueString, modifier[hash], &mystructVar + offsets(hash));
Cf, конечно, вы можете изменить здесь, включив "element =" в строку или подобное. Таким образом, вы можете поместить всю строку в значение и не нужно предварительно обрабатывать ее, я думаю, что это сильно зависит от вашей разборки.