У вас наверняка есть 1 ошибка и 2 потенциальных ошибки
Но это абсолютно не работает, хотя оно даже нарушает цикл for и заставляет меня достигать еще тысячи!
... (ядро сброшено)
как сказано в замечании, вы не инициализируете колоды , это первая ошибка
и:
вы не останавливаете strtok , когда он возвращает NULL, но в зависимости от значения size вы уверены, что size определяет число слова в unsorted_deck
?
вы не копируете ( strdup ) результат strok , поэтому вы сохраняете указатели, указывающие на unsorted_deck
, которые предполагают, что unsorted_deck
никогда не изменяется, и его жизнь достаточно длинна
Если размер значения точно количество слов в unsorted_deck
char **order_deck(char *unsorted_deck, int size) {
char *ptr;
char ** decks = malloc(size * sizeof(char *));
if (desk == NULL)
/* not enough memory */
return NULL;
ptr = strtok(unsorted_deck, " ");
printf("%i\n", size);
for(int i = 0; i < size; i++) {
decks[i] = ptr; /* or decks[i] = strdup(ptr); */
printf("%i:%s\n",i, decks[i]);
ptr = strtok(NULL, " ");
}
return decks;
}
Если вы не знаете, сколько слов в unsorted_deck
, realloc можно использовать для расширения результирующего массива.
вам также нужен способ указать, сколько слов вы сохранили в результате. Первая возможность состоит в том, чтобы изменить роль size на выходную переменную, которая будет установлена числом слов.
char **order_deck(char *unsorted_deck, int * size) {
char *ptr;
char ** decks = NULL;
*size = 0;
ptr = strtok(unsorted_deck, " ");
while (ptr != NULL) {
*size += 1;
decks = realloc(decks, (*size) * sizeof(char *));
if (deck == NULL) {
/* not enough memory*/
return NULL; /* because *size is not null the caller knows the problem */
}
decks[*size - 1] = ptr; /* or decks[*size - 1] = strdup(ptr); */
printf("%i:%s\n",*size - 1, decks[*size - 1]);
ptr = strtok(NULL, " ");
}
return decks;
}
Другая возможность - завершить результат указателем NULL.
char **order_deck(char *unsorted_deck) {
char *ptr;
char ** decks = NULL;
int size = 0;
ptr = strtok(unsorted_deck, " ");
while (ptr != NULL) {
size += 1;
decks = realloc(decks, size * sizeof(char *));
if (deck == NULL) {
/* not enough memory*/
return NULL;
}
decks[size - 1] = ptr; /* or decks[size - 1] = strdup(ptr); */
printf("%i:%s\n",size - 1, decks[size - 1]);
ptr = strtok(NULL, " ");
}
/* add NULL ptr */
decks = realloc(decks, (size + 1) * sizeof(char *));
if (desk != NULL)
decks[size] = NULL
return decks;
}