qsort用Player比较函数报错:‘*p1’是指针,需用‘->’?如何正确比较?
qsort比较函数的错误修正与正确写法
以下是我用于qsort的Player姓名比较函数:
int cmp_Player_name(Player **p1, Player **p2){ if (*p1->name > p2->name){ return 1; } if (p1->name < p2->name){ return -1; } if (p1->name == p2->name){ return 0; } }
运行时触发报错:
error: '*p1' is a pointer; did you mean to use '->'?
我尝试了以下几种方式,都没法正确比较:
(*p1->name > *p2->name)(*(*p1)->name- 初始化char变量后进行比较
正确的解决方法
1. 先解决运算符优先级问题
->的优先级比*高,所以*p1->name会被编译器解析成*(p1->name),但p1是Player**类型,不能直接用->访问成员。必须先解引用p1得到Player*,再用->访问name,也就是写成(*p1)->name,同理p2要写成(*p2)->name。
2. 字符串不能直接用>、<、==比较
直接用关系运算符比较字符串,实际上比较的是字符串指针的内存地址,不是字符串内容。C语言中必须用strcmp函数来比较字符串内容。
最终正确代码
#include <string.h> // 必须包含strcmp的头文件 int cmp_Player_name(Player **p1, Player **p2){ const char* name1 = (*p1)->name; const char* name2 = (*p2)->name; // strcmp的返回值正好符合qsort的要求: // 大于0表示name1>name2,小于0表示name1<name2,等于0表示相等 return strcmp(name1, name2); }
这样写既解决了运算符优先级导致的编译错误,又能正确比较字符串内容,完全符合qsort比较函数的规范。
内容的提问来源于stack exchange,提问作者Programming_jager
相关产品推荐
相关产品推荐

