Обращение к элементу структуры по имени (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, что означает успешный конец работы программы.