需要两个void *并将其进行比较的函数

时间:2019-03-16 13:11:16

标签: c function

在我学校的任务中,我有一个编码功能比较的问题。

布局:

int compare(const void* s1,const void* s2){
/**
 * Comapares two "entries" based on their votes
 *
 * @return 0 in case if they are same, positive value if first entry is bigger than the 
 * second one, negative value if the second entry is bigger than the first one
 */
}

所以基本上,这就是我的任务布局的样子。要了解条目的含义,是它们对于.h文件中的结构看起来像这样的结构是无效的:

struct student {
    // Name of student
    char name[BUFSIZE];
    // number of votes
    int votes;
};

我应该接受这些条目,并根据他们的投票对其进行比较。问题是void *“值”,因为我尝试了几乎所有的内存比较函数中的所有内容,试图将该条目存储到此预定义的结构中,但是如果我返回它,它将返回大数字,并且基本上我不知道如何获取这些空值并进行比较他们。

我正在寻找有关在这种情况下应如何进行的任何建议。

4 个答案:

答案 0 :(得分:1)

在指针s1和s2处有2个对象。

在比较对象之前,首先需要附加它们的类型。

您必须知道哪些类型的对象应留在这些位置并将其转换为这些类型。

所以,您需要做

  TYPE *obj1 = (TYPE*) s1;
  TYPE *obj2 = (TYPE*) s2;

然后可以使用* obj1,* obj2等进行比较。

假设这些指针是struct student类型的对象,那么您需要这样做

  struct student *a = (struct student*)s1;
  struct student *b = (struct student*)s2;

并使用strcmp(a->name, b->name)或通过a->votes > b->votes a.s.o..p比较它们。

答案 1 :(得分:0)

无论如何,您都应将void*转换为struct student数据类型:

这必须是您对compare函数的实现:

// Example program
#include <iostream>
#include <string.h>

struct student {
    // Name of student
    char name[100];
    // number of votes
    int votes;
};

int compare(const void* s1,const void* s2)
{
    // Votes comparison
    if(((struct student*)s1)->votes > ((struct student*)s2)->votes)
    {
        // s1 vote is bigger than s2 vote
        printf("the first vote is bigger than the second\n");
    }

    if(((struct student*)s1)->votes < ((struct student*)s2)->votes)
    {
        // s1 vote is less than s2 vote
        printf("the first vote is less than the second\n");
    }

    if(((struct student*)s1)->votes == ((struct student*)s2)->votes)
    {
        // s1 vote is equals to s2 vote
        printf("the first vote is equals to second\n");
    }

    // Student name comparison
    return (strcmp(((struct student*)s1)->name, ((struct student*)s2)->name));
};

主要:

int main()
{
    student s1, s2;
    strcpy(s1.name, "a"); s1.votes = 5;
    strcpy(s2.name, "b"); s2.votes = 2;

    printf("%d", compare(&s1, &s2));
}

关于strcmp的返回值:

此函数返回如下值:

  • 如果返回value < 0,则表明str1小于str2

  • 如果返回value > 0,则表明str2小于str1

  • 如果返回value = 0,则表明str1等于str2

Try this online

答案 2 :(得分:0)

这似乎是要传递给int compare( void *, void * )函数的qsort()函数。

qsort() is a standard C function

  

7.22.5.2 qsort功能

     

简介

     

1

      #include <stdlib.h>
      void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));
     

说明

     

2 qsort函数对nmemb对象的数组进行排序,   base指向其中的元素。每个对象的大小是   按大小指定。

     

3数组的内容按以下升序排列   到compar所指向的比较函数,该函数用   指向要比较的对象的两个参数。功能   如果满足以下条件,则应返回小于,等于或大于零的整数:   第一个参数被认为分别小于,等于   达到或大于秒。

     

4如果两个元素比较相等,则它们在结果中的顺序   未指定排序数组。

     

返回

     

5 qsort函数不返回任何值。

给出您的struct

struct student {
    // Name of student
    char name[BUFSIZE];
    // number of votes
    int votes;
};

我假设votes字段确定哪个struct比另一个字段“更大”。

请注意,我认为“如果它们相同,则返回0;如果第一个条目大于第二个条目,则返回正值;如果第二个条目大于第一个条目,则返回负值”,这是一个令人恐惧的声明。从字面上看,传递的每个struct指针的大小与每个struct本身的大小完全相同,因此严格遵守此要求意味着您的函数真正要做的就是返回0。 (如果这是课堂作业,我强烈建议您将其转为警告,同时警告您将对这个问题发表老师的评论...)

但是,假设您按照投票顺序进行排名:

int compare( void *p1, void *p2 )
{
    struct student *s1 = p1;
    struct student *s2 = p2;

    return( s1->votes - s2->votes );
}

答案 3 :(得分:0)

知道了!

我用了你们的评论并将其转换为这样的结构:

struct student s;
s = *(struct student *)s1;

当我尝试获取s.votes的值时,它正常工作,我只有一个问题,因为我不了解该指针在()之前,为什么它必须在()之前而不是像(struct student *)(*s1)