Здесь вы ошибаетесь:
else //otherwise chars of a word get appended to string array
{
str[i] = ch;
i++;
}
Когда вы впервые входите в основной цикл, str
не инициализируется. Это означает, что когда вы добавляете символы в str[i]
, в конце строки нет завершающего нулевого байта. Это приводит к тому, что строковые функции, такие как strlen
и strcpy
, потенциально читают за конец массива, вызывая неопределенное поведение .
Это можно исправить, инициализировав str
для всех нулей:
char str[100] = {0};
Вызов memset
после копирования строки очищает ее для последующих слов.
Кроме того, это не лучшее использование goto
:
for(int x=0; x<j; x++)
{
//if current str is already in array, skip appending
if (!strcmp(str_array[x], str)) goto ELSE;
}
strcpy(str_array[j], str);
j++;
ELSE:
i=0;
memset(str, 0, strlen(str));
Было бы правильнее установить флаг, если ваш поиск был успешным, и действовать по нему при выходе из цикла:
int found = 0;
for(int x=0; x<j; x++)
{
//if current str is already in array, skip appending
if (!strcmp(str_array[x], str)) {
found = 1;
break;
}
}
if (found) {
strcpy(str_array[j], str);
j++;
}
i=0;
memset(str, 0, strlen(str));
}