Когда вы присваиваете words[words_added] = response
, вы копируете адрес (не содержимое) response
в массив. Таким образом, в исходном виде ваш код должен видеть второе слово и каждое последующее слово как дубликаты. Когда вы используете tmp
, код сравнивает каждый новый response
с предыдущим tmp
, который был сохранен в (каждом месте) words[]
, а затем копирует его в tmp
, если он не является дубликатом.
Поэтому я подозреваю, что ваш код обнаружит дубликат, который немедленно следует за оригиналом, но не тот, который встречается через 2 или более слов.
Массив words
содержит 4 указателя, но памяти для этих указателей не выделено.
Вам необходимо выделить память для каждого элемента массива words
, а затем скопировать в него каждую строку:
if (duplicate_flag == 0)
{
words[words_added++] = strdup(response); // allocates mem and copies the string
puts("that's new!");
} else {
...
}
Тогда обязательно free
память в конце вашей программы:
for (i = 0; i < words_added; ++i) {
free(words[i]);
}