Сохранение строк в наборе , тип данных, в котором нет повторяющихся значений и который можно быстро найти.По сути, это хеш-таблица, ключом которой является строка, а значение не имеет значения.
Вы можете написать собственную хеш-таблицу, это хорошее упражнение, но для производства лучше использовать существующую.как от GLib .У него уже есть удобные методы для использования хеш-таблицы в качестве набора.Пока мы здесь, мы можем использовать их g_strchomp()
и g_strdup()
.
#include <stdio.h>
#include <glib.h>
int main () {
// Initialize our set of strings.
GHashTable *set = g_hash_table_new(g_str_hash, g_str_equal);
// Allocate a line buffer on the stack.
char line[1024];
// Read lines from stdin.
while(fgets(line, sizeof(line), stdin)) {
// Strip the newline.
g_strchomp(line);
// Look up the string in the set.
char *string = g_hash_table_lookup(set, line);
if( string == NULL ) {
// Haven't seen this string before.
// Copy it, using only the memory we need.
string = g_strdup(line);
// Add it to the set.
g_hash_table_add(set, string);
}
printf("%p - %s\n", string, string);
}
}
И вот небольшая демонстрация.
$ ./test
foo
0x60200000bd90 - foo
foo
0x60200000bd90 - foo
bar
0x60200000bd70 - bar
baz
0x60200000bd50 - baz
aldskflkajd
0x60200000bd30 - aldskflkajd
aldskflkajd
0x60200000bd30 - aldskflkajd