Жуть. Три года расстрела через повешение за такой код. realloc на каждый символ, обнуление указателя без освобождения памяти, постоянное индексное обращение при переборе строки - кол с минусом.
А ошибка очень простая - запись символа производится в word[j], соответственно на втором слове j начинается не с нуля. Вам ещё повезло, что программа не пытается записать символы поверх кода или в чужую область.
bool checkString(char **text, char *separator, int num_str) {
char *str, *cur, *word;
int len;
for (int i = 0; i < num_str; i++, text++) {
str = cur = *text;
while (*cur) {
if (strchr(separator, *cur)) {
len = cur-str;
word = malloc(len+1);
strncpy(word, str, len);
puts(word);
free(word);
str = cur;
}
cur++;
}
puts(str);
}
return true;
}