在我学校的任务中,我有一个编码功能比较的问题。
布局:
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 *“值”,因为我尝试了几乎所有的内存比较函数中的所有内容,试图将该条目存储到此预定义的结构中,但是如果我返回它,它将返回大数字,并且基本上我不知道如何获取这些空值并进行比较他们。
我正在寻找有关在这种情况下应如何进行的任何建议。
答案 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
。
答案 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)