Обращение к элементу структуры по имени (char *) - C (СИ)
Формулировка задачи:
Здравствуйте.
Пишу на чистом Си, потребовалось использование конфигурационного файла, решил сделать файл следующей структуры:
Соответственно код организован примерно так (упрощено):
Хотелось бы сделать более универсально, т.е. обратиться к элементу структуры по имени из переменной fieldName (char *). Например:
Заранее спасибо.
field1=1val field2=value2
struct { char * field1; char * field2; } options; //Происходит считывание; ... //Вносим данные в структуру; if (fieldName == "field1") options.field1 = fieldValue; else if (fieldName == "field2") options.field2 = fieldValue;
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; }
Объяснение кода листинга программы
- Объявление структуры database с двумя полями: массивом ключей типа unsigned long и массивом значений типа int.
- Реализация функции hash, которая принимает строку в качестве аргумента и возвращает хеш-значение этой строки.
- Реализация функции get_value, которая принимает указатель на структуру database и строку в качестве аргументов и возвращает значение, связанное с данным ключом.
- Инициализация структуры database в функции main.
- Создание массива символов buf, который будет использоваться для чтения строк из стандартного ввода.
- Чтение строк из стандартного ввода в цикле while с помощью функции fgets.
- Вызов функции get_value для каждой прочитанной строки с целью получить соответствующее значение.
- Вывод значения на экран или сообщение
Undefined!
в случае, если значение не найдено. - Возврат 0 в конце функции main, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д