2

通过反复试验,我设法使以下字符串比较函数按预期与 qsort() 一起使用,但我真的不明白为什么在 (const char*) 强制转换表达式中需要星号。有人可以剖析和解释:-

int strCompare(const void *a, const void *b) {
    return strcmp((const char*)a, (const char*)b);
} 

附录:-

void findStrings(int * optionStats, char strings[][MAX_STRING_SIZE + 1], int numStrings)
{
    qsort(strings, numStrings, 21*sizeof(char), strCompare);
}

有没有办法通过 strCompare() 消除对 strcmp() 的调用,而只使用 strcmp() 作为 qsort() 的参数?

4

4 回答 4

3

您需要一个星号,因为您想将一个指针转换const void为一个指针const char而一个星号表示它们是指针类型。

事实上,您并不需要转换,因为pointer to void类型可以隐式转换为pointer to TC 语言中的类型,而 C++ 并非如此。

于 2012-08-24T05:31:02.033 回答
2

正如其他人在这里提到的那样,您不需要定义新函数,只需转换指针类型即可。以下是在将函数传递给时如何强制转换函数qsort,以防止任何警告/错误:

qsort(arr,
      sizeof(arr)/sizeof(char*),
      sizeof(char*),
      (int(*)(const void *, const void *))strcmp);
于 2012-08-24T06:17:32.393 回答
1

的签名strcmp是(还有一个,但这是您正在使用的):

int strcmp(const char *s1, const char *s2);

因此,由于您的函数 (ab) 的参数是const void,您必须执行这些强制转换。

只要您在调用时用作参数的变量qsort将传递给strCompareas ,这将是正确的char *

于 2012-08-24T05:28:41.020 回答
0

因为

int strcmp(
   const char *string1,
   const char *string2 
);

是这样定义的。如果您不将其转换为“ const char* ”,则变量“ a ”应该是指向 void 的类型指针。如果你打字更好理解

const void *a as const void* a

星号与数据类型相关联。

因此,要将整个变量“a”转换为指向“const char”数据类型的指针,您也必须使用星号。

于 2012-08-24T05:36:38.293 回答