我正在使用C语言进行代码练习。
如下代码,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
int ACDSort(const void *p1, const void *p2);
int Compare(const void *pKey, const void *pValue);
int main(void)
{
char * strAry[4] = {"Hardware","Cookie","Boy","Power"};
char * destStr = "Cookie";
//qsort((void*)strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), ACDSort);
char **ptrAdr = (char**)bsearch((void*)destStr, strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), Compare);
printf("%s\n", *ptrAdr);
}
int Compare(const void *pKey, const void *pValue) {
char *key = ((char*)pKey);
char *value = *((char**)pValue);
return strcmp(key, value);
}
int ACDSort(const void *p1, const void *p2) {
char * n1 = *((char**)p1);
char * n2 = *((char**)p2);
int ret;
if (strlen(n1) > strlen(n2))
ret = 1;
else if (strlen(n1) < strlen(n2))
ret = -1;
else
ret = 0;
return ret;
}
我致电bsearch
找到cookie
的字符串。
问题是当我擦除//
以便根据字符串长度对数组进行排序时发生错误。
我不知道为什么错误被执行了,因为我认为qsort
无法对我的代码产生重大影响。
你能否告诉我在删除//
时返回空指针时出错的原因?
聚苯乙烯。我使用qsort
和bsearch
来熟悉指针变量。
答案 0 :(得分:5)
bsearch
使用二进制搜索,这就是原因。二进制搜索需要对数据进行排序。按字母顺序对字符串数组进行排序,它将起作用。
作为旁注,你需要摆脱所有那些多余的演员阵容,他们所做的只是隐藏潜在的错误。
修复和清理后的工作程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare (const void* p1, const void* p2);
int main (void)
{
const char* strAry[4] = {"Boy", "Cookie", "Hardware", "Power"};
const char* key = "Cookie";
char** ptrAdr = bsearch(key,
strAry,
sizeof(strAry)/sizeof(*strAry),
sizeof(*strAry),
compare);
printf("%s\n", *ptrAdr);
}
int compare (const void* p1, const void* p2)
{
const char* s1 = p1;
const char* s2 = *(const char* const*)p2;
return strcmp(s1, s2);
}
p2将结束const
指向const char*
的空指针,这就是为什么我们在争取const正确性时会得到奇怪的演员。
答案 1 :(得分:-1)
destStr
的类型可以更改为strAry
的类型,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Compare(const void *pKey, const void *pValue)
{
char *key = *((char**)pKey);
char *value = *((char**)pValue);
return strcmp(key, value);
}
int main(void)
{
char * strAry[4] = { "Hardware", "Cookie", "Boy", "Power" };
char * destStr[1] = { "Cookie" }; // Type changing
qsort(strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), Compare);
char **ptrAdr = (char**)bsearch((void*)destStr, strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), Compare);
printf("%s\n", *ptrAdr);
}
另外,如果您使用C语言(和编译器),请考虑直接使用strcmp
作为比较两个元素的回调函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*int Compare(const void *pKey, const void *pValue)
{
char *key = *((char**)pKey);
char *value = *((char**)pValue);
return strcmp(key, value);
}*/
int main(void)
{
char * strAry[4] = { "Hardware", "Cookie", "Boy", "Power" };
char * destStr[1] = { "Cookie" }; // Type changing
//qsort(strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), Compare);
qsort(strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), strcmp);
//char **ptrAdr = (char**)bsearch((void*)destStr, strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), Compare);
char **ptrAdr = (char**)bsearch(destStr, strAry, sizeof(strAry) / sizeof(char*), sizeof(char*), strcmp);
printf("%s\n", *ptrAdr);
}
注意:强>
此解决方案有一个缺点,显示为......
警告:从不兼容的指针类型[默认启用]
传递'bsearch'的参数5
但它有效(我已尝试使用GCC版本4.8.2和MS Visual studio 12.0)