【问题标题】:Casting Const Void to String Errors将 const Void 转换为字符串错误
【发布时间】:2021-11-23 23:27:55
【问题描述】:

我在这里有这行代码,我试图将两个 void 参数类型转换为字符串,然后使用 strcmp 函数比较两者:

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

但是,我不断收到错误,

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

我很确定我选对了,所以我不知道问题出在哪里。之前,我遇到了分段错误,但解决了,现在卡在这里。

编辑: 这是我用来比较名字、IDS 和姓氏的结构。原来我必须将 void * 转换为 Student *,我对此有点困惑

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

【问题讨论】:

  • 请说明您使用此比较功能的目的。在我看来,您似乎想将其用于qsort 或类似的东西。
  • 是的,它将与结构一起用于 qsort
  • 那么你仍然不需要双指针。只需将p1p2 移动到两个Student* 指针(s1s2)然后return strcmp(s1->firstname, s2->firstname);。但这确实是 0___________ 给出的答案(编辑后稍作修改)。
  • 这个函数的目的是什么?比较两个给定对象或所有元素的特定元素?用例是什么?

标签: c casting


【解决方案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);
}

编辑前

您并没有试图将“字符串”转换为指向 char 的指针,它与 C 字符串没有任何共同之处。

您也不希望获得对本地参数p1p2 的引用

你想要:

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 是指向结构体的指针,所以需要使用-> 来访问成员。

    【讨论】:

    • @Cheatah 这里没有演员表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多