Поглотить одинаковые строки на один и тот же указатель - PullRequest
0 голосов
/ 02 июня 2018

Я делаю программу, которая читает текстовый файл, состоящий из строк, каждая из которых находится в строке.В основном я делаю это:

...
char* name;
char* buffer = malloc(sizeof(char) * SIZE); //size is a defined constant in the header
while(fgets(buffer, SIZE, pf)){ //pf is the opened stream
    name = malloc(sizeof(char) * SIZE);
    strcpy(name, strtok(buffer, "\n"));
    manipulate(name); //call an extern function
}

Функция манипулировать объявляется следующим образом:

void manipulate(void* ptr);

Проблема в том, что таким образом две равные строки будут иметь разныеадреса памяти, поэтому они будут распознаваться как два разных элемента из манипулировать функции.

Как я могу сделать их распознавать как один элемент?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Сохранение строк в наборе , тип данных, в котором нет повторяющихся значений и который можно быстро найти.По сути, это хеш-таблица, ключом которой является строка, а значение не имеет значения.

Вы можете написать собственную хеш-таблицу, это хорошее упражнение, но для производства лучше использовать существующую.как от 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
0 голосов
/ 02 июня 2018

Если у вас действительно есть две строки, то они обязательно имеют разные адреса, независимо от того, совпадает ли их содержимое.Похоже, вы хотите отслеживать строки, которые вы уже прочитали, чтобы избежать / объединить дубликаты.Это начинается с части «отслеживания».

Очевидно, тогда вам нужна какая-то структура данных, в которой можно записывать строки, которые вы уже прочитали.У вас есть много вариантов для этого, и у них есть различные преимущества и недостатки.Если количество различных строк, которые вам нужно обработать, относительно мало, тогда может быть достаточно простого массива или связанного списка, но если он достаточно велик, то хеш-таблица обеспечит гораздо лучшую производительность.

С этим встороны, вы проверяете каждую вновь прочитанную строку по сравнению с ранее прочитанной и действуете соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...