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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
 
#define N 3
 
typedef struct database {
    unsigned long keys[N];
    int values[N];
} database;
 
unsigned long hash(const char* str)
{
    unsigned long h = 0;
    while( *str && *str != '\n' ) {
        h *= 101;
        h += (unsigned char) *str++;
    }
    return h;
}
 
int get_value(const database* const db, const char* const key)
{
    const unsigned long h = hash(key);
    unsigned int i;
    for( i = 0; i < N; ++i ) {
        if( db->keys[i] == h ) { return db->values[i]; }
    }
    return -1;
}
 
int main(void)
{
    database db;
    db.keys[0] = hash("key1");
    db.keys[1] = hash("key2");
    db.keys[2] = hash("key3");
    db.values[0] = 1;
    db.values[1] = 2;
    db.values[2] = 3;
 
    char buf[20];
 
    while( fgets(buf, sizeof(buf), stdin) ) {
        int v = get_value(&db, buf);
        if( v == -1 ) {
            puts("Undefined!");
        } else {
            printf("%d\n", v);
        }
    }
 
    return 0;
}

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

  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
Похожие ответы