#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
не касаясь остальной части программы. Если у вас возникли проблемы с другой программой, пожалуйста, задайте отдельный вопрос.