Что касается указателя функции в C?

#c #function #pointers #function-pointers #void-pointers

Вопрос:

Я новичок в языке Си и изучал указатель функций на языке Си. Там я столкнулся с проблемой?

Напишите функцию сравнения для сортировки по первому символу имени?

*int (firstnamecharcompar)(константа пустоты * a, константа пустоты * b))

Вот мое кодовое решение для этого.

 #include<stdlib.h>
#include<stdio.h>
#include <stdbool.h>

int compare1(const void *a,const void *b)
{
    char *c = *(char**)a;
    char *d = *(char**)b;
    return c[0] - d[0];
    //return ( *(char*)a[0] == *(char*)b[0] );
}

int main()
{
    char str[3][10];
    int i;
    for(i=0;i<3;i  )
    {
        printf("Enter %d string => " , i 1 );
        scanf("%s", str[i]);
        printf("n");
    }
    
    for(i=0;i<3;i  )
    {
        printf("%s ",str[i]);
    }
    
    qsort(str,3,10,compare1);
    
    for(i=0;i<3;i  )
    {
        printf("%s ",str[i]);
    }
    return 0;
}
 

Но мой код завершается без каких-либо выходных данных?
В чем проблема с моим кодом?

Комментарии:

1. Начните с использования отладчика , чтобы отследить любой возможный сбой и определить, когда и где он происходит в вашем коде. Затем проверьте значения всех задействованных переменных, чтобы убедиться, что все они выглядят корректными.

2. @Someprogrammerdude Я думаю, что все в порядке..

3. @folibis 3 верно, да, но поскольку каждый элемент в str массиве равен 10 байтам, второй «размер» в коде правильный.

4. @folibis sizeof(char) будет равен 1 байту, но здесь каждый str равен 10 байтам

5. Ваша функция сравнения предполагает, что вы сортируете массив указателей, но ваша основная функция содержит массив массивов. Указатели и массивы-это не одно и то же.

Ответ №1:

 char *c = *(char**)a;
char *d = *(char**)b;
 

Эти строки были бы действительны, если бы вы сортировали массив указателей char . На самом деле вы сортируете массив из 10 char массивов элементов. Соответствующим образом отрегулируйте слепки:

 char *c = *(char(*)[10])a;
char *d = *(char(*)[10])b;
 

Комментарии:

1. Спасибо, решил проблему. Поэтому, если мы используем строку в качестве 2d-массива, нам нужно ввести приведение соответствующим образом.

2. Но что, если мы использовали char* str[3]; для(i=0;i

3. @Hashinclude Тогда у вас другой вопрос.

4. Хорошо, тогда как нам нужно ввести указатель на пустоту в функции compare1?

5. @Hashinclude Не уверен, что вы имеете в виду. Ответ точно показывает, что нужно сделать, compare1 не касаясь остальной части программы. Если у вас возникли проблемы с другой программой, пожалуйста, задайте отдельный вопрос.