Я пытаюсь реализовать структуру данных, в которой у меня есть список значений char * и массив, в котором хранится число вхождений для каждого уникального значения char * из строки cmd. Это немного грязно, но я думал, что понял это, пока не попробовал протестировать его (каждый тест не нужно компилировать по-разному, я просто переименовал каждый прогон, чтобы названия тестов были разными).
Test входные данные cmd:
test1 a b c d e f g
test2 a a b b c d d e f f g g
test3 a a a a a a a a a a a
test4 a a a a a a a a a a a b c c
test5 a j i q y z n f o p m a
test6 a a b b c d d e f f g
test7 a j k q e s l i h i a
test8 a j i q y z n f o p m
Исходя из этих входных данных, длина таблицы для каждого должна выглядеть следующим образом:
test1 table->length = 7 <- works
test2 table->length = 7 <- works
test3 table->length = 1 <- works
test4 table->length = 3 <- works
test5 table->length = 11 <- works
test6 table->length = 7 <- no work
test7 table->length = 9 <- no work
test8 table->length = 11 <- no work
Исходя из этих результатов, я не верю, что это длина argc
(как работает тесты 1, 2, 3) и число уникальных *char
s (согласно тестам 2, 3, 4,5). При выполнении кода ниже, он либо работает, и я дохожу до конца main(...)
, или, в зависимости от ввода, он не выполнится после отображения:
...
ptr address: 00DF04F4
ptr value: 00DF0510
test. c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
char *path;
int index;
struct node *next;
} node;
typedef struct lookup {
struct node *head;
struct node *ptr;
int length;
int array[];
} lookup;
void add(lookup *table, char *path);
void search(lookup *table, char *path, int *i);
void add(lookup *table, char *path) {
int i = 0;
search(table, path, &i);
if(table->ptr == NULL) {
node *new_node = malloc(sizeof(node));
if (table->head == NULL) {
table->head = new_node;
table->head->next = NULL;
table->head->path = path;
table->array[0] = 1;
table->head->index = 0;
table->length = 1;
} else {
new_node->path = path;
new_node->next = table->head;
table->head = new_node;
table->array[i] = 1;
table->head->index = i;
table->length += 1;
}
} else {
table->array[table->ptr->index] += 1;
}
}
void search(lookup *table, char *path, int *i) {
if(table->head == NULL) {
table->ptr = NULL;
return;
}
table->ptr = table->head;
(*i) = 0;
while(table->ptr != NULL) {
printf("ptr address: %p\n", &(table->ptr));
printf("ptr value: %p\n", (table->ptr));
/* FAILURE POINT */
printf("%s\n", table->ptr->path);
printf("comparing ptr string: '%s' with given '%s'\n", table->ptr->path, path);
if(strcmp(table->ptr->path, path) == 0) {
printf("found match!\n");
return;
}
table->ptr = table->ptr->next;
(*i) += 1;
}
printf("could not find '%s' in table\n", path);
}
int main(int argc, char **argv) {
lookup *table = malloc(sizeof(lookup) + argc);
table->head = NULL;
int i = 1;
for(i; i < argc; i++) {
printf("\n\ntry adding: %s\n", argv[i]);
add(table, argv[i]);
}
printf("\n\n############\nfinished adding\n");
printf("table length: %d\n", table->length);
return 0;
}
Я знаю, что указатель не равен нулю (так как я печатаю его адрес и значение прямо перед этим), но я не уверен, почему он останавливает выполнение, когда он делает это с обычным вводом. Ожидаемый результат (на основе текущего кода) должен показывать каждый char*
, который пытается быть добавлен, адрес и значение указателя при search(...)
поиске в таблице, текущий *char
ptr указывает на то, что два *char
s сравниваются, независимо от того, найдено совпадение или search(...)
не может найти *char
.