Не понимаю почему выпадает в ошибку SEGMENTATION FAULT, подскажите пожалуйста
Должен по порядку отсортировать слова, но почему то выпадает в ошибку
# include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int ft_strcmp(char *s1, char *s2)
{
int i=0;
while (s1[i])
{
if (s1[i]>s2[i])
return 1;
if (s1[i]<s2[i])
return -1;
if (s1[i]==s2[i])
return 0;
i++;
}
return 66;
}
void ft_sort_string_tab(char **tab)
{
int i=0;
char *tmp;
while (tab[i]!=0)
{
if (ft_strcmp(tab[i], tab[i+1])==1)
{
tmp=tab[i];
tab[i]=tab[i+1];
tab[i+1]=tmp;
}
i++;
}
}
int main(void)
{
char *tab[3]={"ccc" "bbc" "abc"};
int i=0;
ft_sort_string_tab(tab);
while (tab[i]!=0)
{
printf("%s ", tab[i]);
i++;
}
return 0;
}
Ответы (2 шт):
if (ft_strcmp(tab[i], tab[i+1])==1)
В этой строке выражение tab[i+1] - нулевой указатель. Функция ft_strcmp разыменовывает его. Программа падает.
Строки в инициализаторе массива не разделены запятыми. Компилятор склеивает их в одну строку. В вашем массиве будет одна строка и два нулевых указателя.
Когда вы исправите эти ошибки вы обнаружите что циклы обращаются за пределы массива и читают случайную память:
while (tab[i]!=0)
Алгоритм сортировки не сортирует.
Функция сравнения строк сравнивает только первые символы. Остальные не учитываются.
P.S. Научитесь пользоваться отладчиком.
Как правильно написал @Stanislav Volodarskiy, у вас функция ft_strcmp() сравнивает только первые символы строк, а не полностью строки. При любом раскладе функция завершится после сравнения первого символа строк. А если бы не завершился после сравнения первого символа, то вышел бы за пределы массива.
{
if (s1[i]>s2[i])
return 1;
if (s1[i]<s2[i])
return -1;
if (s1[i]==s2[i])
return 0;
i++; // уже никогда не выполнится
}
Все циклы в программе у вас выходят за пределы массивов.
В функции ft_sort_string_tab() массив tab[] состоит из 3 ненулевых элементов. А что произойдет, когда i==3? Попытка прочитать значение за пределами массива - неопределенное поведение (UB), чаще всего падение программы.
while (tab[i]!=0)
{
// ...
i++;
}
В main() - то же самое. tab[] из 3 ненулевых элементов, и вы пытаетесь прочитать значение tab[3], а если программа не рухнет, попытаетесь прочитать значение tab[4] и т.д. пока программа рухнет. Так вот ошибка SEGMENTATION FAULT - выход за пределы массива или сегмента выделенной памяти, что вы везде успешно и делаете.
while (tab[i]!=0)
{
printf("%s ", tab[i]);
i++;
}