char **str;
char *tr;
int cnt, k;
cnt = k = NULL;
printf("Enter number fo strings:\n");
scanf("%d", &n);
for (int i = 0; i < n; i++)
str[i] = (char*)malloc(sizeof(char)*n); // here
вы используете str
, который не инициализирован.Что вы ожидаете?str
имеет неопределенное значение, поскольку оно неинициализировано и почти наверняка содержит недопустимое значение указателя.Разыменование недействительного указателя (что делает оператор []
) - это неопределенное поведение.
Что вам нужно сделать, это сначала выделить память для str
для хранения указателей на строки.
Кстати.
puts("Enter The strings");
for (int i = 0; i < n; i++)
{
for (int j = 0; i < n; j++)
scanf("%s", &str[i][j]);
}
Также неверно.Внутреннему циклу не нужно читать входные данные из стандартного ввода и сохранять их в str[i]
.Кроме того, не используйте %s
без указания символа для ограничения количества символов, записываемых в место назначения.
if (str[i][j] >= 'a' && str[i][j] <= 'z')
Вот для чего islower()
из <ctype>
.
free(str);
Этого недостаточно для освобождения памяти, поскольку str
указывает на количество указателей на char
, которые также указывают на выделенную память.
for (size_t i = 0; i < n; ++i)
free(str[i]);
free(str);
на помощь.