Обращение к элементу структуры по имени (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, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д