C: void 指向 char[] 类型结构成员的指针
C: void pointer to struct member of type char[]
我有这个class
struct person {
char name[100];
int age
};
然后这个数组:
struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };
然后我想写一个可以传递给 qsort
的函数;像这样的函数:
int compare_name(const void *a, const void *b);
通常情况下,例如有这样一个字符串数组时
char names[5][10] = { "xxx", "uuu", "ccc", "aaa", "bbb" };
我可以像这样使用 const void * a
和 const void *b
:
int compare_name(const void *a, const void *b) {
for (; *( char*)a == *(char *)b; a++, b++)
if (*(char *)a == '[=14=]') return 0;
return *(char *)a - *(char *)b;
但是我如何编写相同的方法,即如果我想对数组进行排序,我如何告诉 C void 指针指的是 struct person
的字段 name
按字母顺序排列?
最终,我需要能够像这样调用 qsort
:
int npeople = sizeof(class) / sizeof(struct student);
qsort(people, npeople, sizeof(struct person), compare_name);
但如前所述,我无法将 const void *a
转换为所需的值 (person->name
),就像我在简单地处理字符串数组时对 *( char*)a
所做的那样。
非常感谢您的帮助!
I have this class
struct person {
char name[100];
int age };
and then this array:
struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };
您的代码中有很多拼写错误,例如 struct person
和 struct student
是不同的类型说明符。而C中没有类与C++相对的
尽管如此,比较函数可以如下所示
#include <string.h>
//...
int compare_name( const void *a, const void *b )
{
const struct person *p1 = a;
const struct person *p2 = b;
return strcmp( p1->name, p2->name );
}
还要注意像这样的增量操作 a++, b++
没有为类型 c/v void *
的指针定义,尽管一些编译器可以有自己的语言扩展,这与 C 标准相矛盾..
我有这个class
struct person {
char name[100];
int age
};
然后这个数组:
struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };
然后我想写一个可以传递给 qsort
的函数;像这样的函数:
int compare_name(const void *a, const void *b);
通常情况下,例如有这样一个字符串数组时
char names[5][10] = { "xxx", "uuu", "ccc", "aaa", "bbb" };
我可以像这样使用 const void * a
和 const void *b
:
int compare_name(const void *a, const void *b) {
for (; *( char*)a == *(char *)b; a++, b++)
if (*(char *)a == '[=14=]') return 0;
return *(char *)a - *(char *)b;
但是我如何编写相同的方法,即如果我想对数组进行排序,我如何告诉 C void 指针指的是 struct person
的字段 name
按字母顺序排列?
最终,我需要能够像这样调用 qsort
:
int npeople = sizeof(class) / sizeof(struct student);
qsort(people, npeople, sizeof(struct person), compare_name);
但如前所述,我无法将 const void *a
转换为所需的值 (person->name
),就像我在简单地处理字符串数组时对 *( char*)a
所做的那样。
非常感谢您的帮助!
I have this class
struct person {
char name[100];
int age };
and then this array:
struct student people[] = { {"bill", 30}, {"john", 20}, {"bob", 11} };
您的代码中有很多拼写错误,例如 struct person
和 struct student
是不同的类型说明符。而C中没有类与C++相对的
尽管如此,比较函数可以如下所示
#include <string.h>
//...
int compare_name( const void *a, const void *b )
{
const struct person *p1 = a;
const struct person *p2 = b;
return strcmp( p1->name, p2->name );
}
还要注意像这样的增量操作 a++, b++
没有为类型 c/v void *
的指针定义,尽管一些编译器可以有自己的语言扩展,这与 C 标准相矛盾..