Приведение Const Void к ошибкам строки

#c #casting

Вопрос:

У меня здесь есть эта строка кода, в которой я пытаюсь ввести два аргумента void в виде строк, а затем использовать функцию strcmp для сравнения этих двух:

 int compareFirstName(const void * p1, const void * p2)
{
  const char **str1, **str2;
  str1 = (char **) amp;p1;
  str2 = (char **) amp;p2;
  return strcmp(*str1, *str2);
}
 

Тем не менее, я продолжаю получать ошибку,

 assignment from incompatible pointer type [-Werror]
   str1 = (char **) amp;p1;
        ^
 

Я почти уверен, что правильно подбираю, поэтому не знаю, в чем проблема. Раньше у меня была ошибка сегментации, но я ее исправил и теперь застрял здесь.

РЕДАКТИРОВАТЬ: Это структура, которую я использую для сравнения имен, идентификаторов и фамилий. Оказывается, мне нужно преобразовать пустоту * в Студента*, что меня немного смущает

 typedef struct
{
  int ID;
  char firstname[NAME_LENGTH] ;
  char lastname[NAME_LENGTH] ;
} Student;
 

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

1. Пожалуйста, уточните, для чего вы используете эту функцию сравнения. Мне кажется, что вы хотите использовать его для qsort чего-то подобного.

2. Да, он будет использоваться для qsort вместе со структурой

3. Тогда вам все равно не нужны двойные указатели. Просто переместите свое p1 и p2 в два Student* указателя ( s1 и s2 ), а затем return strcmp(s1->firstname, s2->firstname); . Но это действительно ответ, данный 0___________ (с незначительными изменениями после вашего редактирования).

4. Какова цель этой функции? Сравните конкретные элементы двух заданных объектов или все элементы? Каков был бы вариант использования?

Ответ №1:

ПОСЛЕ ВОПРОСА ПРАВКА:

 int compareFirstName(const void * p1, const void * p2)
{
  const Student *str1, *str2;
  str1 = p1;
  str2 = p2;
  return strcmp(str1 -> firstname, str2 -> lastname);
}

/* the real cars is used here */
int compareFirstName1(const void * p1, const void * p2)
{
  return strcmp(((const Student *)p1) -> firstname, ((const Student *)p2) -> lastname);
}
 

ПЕРЕД РЕДАКТИРОВАНИЕМ

Вы не пытаетесь привести в качестве «строк» только указатель на указатель на символ, который не имеет ничего общего со строками C.

Вы также не хотите получать ссылку на локальные параметры p1 и p2

Ты хочешь:

 int compareFirstName(const void * p1, const void * p2)
{
  const char *str1, *str2;
  str1 = p1;
  str2 = p2;
  return strcmp(str1, str2);
}
 

или просто достаточно

 int compareFirstName(const void * p1, const void * p2)
{
  return strcmp(p1, p2);
}
 

Ответ №2:

Учитывая, что вопрос немного отличается от того, что было раньше, я решил опубликовать новый ответ:

 int compareFirstName(const void * p1, const void * p2)
{
    const Student *s1, *s2;
    s1 = p1;
    s1 = p2;
    return strcmp(s1->firstname, s2->firstname);
}
 

Это способ приведения аргументов к структурам, которые вы определили как . void * Student Затем, поскольку p1 и p2 являются указателями на структуры, вам необходимо использовать -> их для доступа к членам.

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

1. @Cheatah здесь нет актерского состава