Существует две проблемы в представлении табличных данных:
1. Представление строки
2. Представлять много строк.
В вашем примере строка может быть представлена как:
struct Table_Record
{
unsigned char ip_address[4];
char domain_name[MAX_DOMAIN_LENGTH];
};
Я решил использовать фиксированную длину поля для доменного имени. Это сделает обработку проще.
Следующий вопрос - как структурировать строки. Это решение вам придется принять. Самое простое предложение - использовать массив. Однако массив имеет фиксированный размер и должен быть перераспределен, если записей больше, чем размер массива:
struct Table_Record table[MAX_ROWS];
Другая структура данных для таблицы - это список (одиночный или двойной, на ваш выбор). К сожалению, язык C не предоставляет структуру данных списка, поэтому вам придется либо написать свою собственную, либо получить библиотеку.
Альтернативными полезными структурами данных являются карты (ассоциативные массивы) и деревья (хотя многие карты реализованы с использованием деревьев). Карта позволит вам получить значение для данного ключа. Если ключом является IP-адрес, карта вернет имя домена.
Если вы собираетесь читать и записывать эти данные с использованием файлов, я предлагаю использовать базу данных, а не писать свою собственную. Многие люди рекомендуют SQLite.