Обращение к элементу структуры по имени (char *) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Пишу на чистом Си, потребовалось использование конфигурационного файла, решил сделать файл следующей структуры:
Листинг программы
  1. field1=1val
  2. field2=value2
Соответственно код организован примерно так (упрощено):
Листинг программы
  1. struct {
  2. char * field1;
  3. char * field2;
  4. } options;
  5. //Происходит считывание;
  6. ...
  7. //Вносим данные в структуру;
  8. if (fieldName == "field1")
  9. options.field1 = fieldValue;
  10. else if (fieldName == "field2")
  11. options.field2 = fieldValue;
Хотелось бы сделать более универсально, т.е. обратиться к элементу структуры по имени из переменной fieldName (char *). Например:
Листинг программы
  1. mystruct[fieldName] = fieldValue;
Заранее спасибо.

Решение задачи: «Обращение к элементу структуры по имени (char *)»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. #define N 3
  4.  
  5. typedef struct database {
  6.     unsigned long keys[N];
  7.     int values[N];
  8. } database;
  9.  
  10. unsigned long hash(const char* str)
  11. {
  12.     unsigned long h = 0;
  13.     while( *str && *str != '\n' ) {
  14.         h *= 101;
  15.         h += (unsigned char) *str++;
  16.     }
  17.     return h;
  18. }
  19.  
  20. int get_value(const database* const db, const char* const key)
  21. {
  22.     const unsigned long h = hash(key);
  23.     unsigned int i;
  24.     for( i = 0; i < N; ++i ) {
  25.         if( db->keys[i] == h ) { return db->values[i]; }
  26.     }
  27.     return -1;
  28. }
  29.  
  30. int main(void)
  31. {
  32.     database db;
  33.     db.keys[0] = hash("key1");
  34.     db.keys[1] = hash("key2");
  35.     db.keys[2] = hash("key3");
  36.     db.values[0] = 1;
  37.     db.values[1] = 2;
  38.     db.values[2] = 3;
  39.  
  40.     char buf[20];
  41.  
  42.     while( fgets(buf, sizeof(buf), stdin) ) {
  43.         int v = get_value(&db, buf);
  44.         if( v == -1 ) {
  45.             puts("Undefined!");
  46.         } else {
  47.             printf("%d\n", v);
  48.         }
  49.     }
  50.  
  51.     return 0;
  52. }

Объяснение кода листинга программы

  1. Объявление структуры database с двумя полями: массивом ключей типа unsigned long и массивом значений типа int.
  2. Реализация функции hash, которая принимает строку в качестве аргумента и возвращает хеш-значение этой строки.
  3. Реализация функции get_value, которая принимает указатель на структуру database и строку в качестве аргументов и возвращает значение, связанное с данным ключом.
  4. Инициализация структуры database в функции main.
  5. Создание массива символов buf, который будет использоваться для чтения строк из стандартного ввода.
  6. Чтение строк из стандартного ввода в цикле while с помощью функции fgets.
  7. Вызов функции get_value для каждой прочитанной строки с целью получить соответствующее значение.
  8. Вывод значения на экран или сообщение Undefined! в случае, если значение не найдено.
  9. Возврат 0 в конце функции main, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы