比较C中的两个字符串(字符串指针)

比较C中的两个字符串(字符串指针),c,C,我有一个字符串数组,声明如下: char * d[] = {"bca", "abc", "cba", "abcd"}; char e[][5] = {"bca", "abc", "z", "dca", "cba"}; 我试图用一个通用比较方法(使用void*)比较d[1]和d[2]: 由于某种原因,当我尝试打印s1\s2时,我会听到一些胡言乱语。 注意:如果数组是这样声明的,则它确实可以工作: char * d[] = {"bca", "abc", "cba", "abcd"

我有一个字符串数组,声明如下:

    char * d[] = {"bca", "abc", "cba", "abcd"};
char e[][5] = {"bca", "abc", "z", "dca", "cba"};
我试图用一个通用比较方法(使用void*)比较d[1]和d[2]:

由于某种原因,当我尝试打印s1\s2时,我会听到一些胡言乱语。 注意:如果数组是这样声明的,则它确实可以工作:

    char * d[] = {"bca", "abc", "cba", "abcd"};
char e[][5] = {"bca", "abc", "z", "dca", "cba"};
编辑:

调用函数的代码:

void sort(void * arr, int arrLength, int sizeOfElement, int (*compare)(void *, void *))
{
    int i, j;
    for(i = 0; i < arrLength; i++)
        for(j = 0; j < arrLength - 1; j++)
            if(compare(((char *)arr + j * sizeOfElement), ((char *)arr + (j + 1) * sizeOfElement)) > 0) swap(((char *)arr + j * sizeOfElement), ((char *)arr + (j + 1) * sizeOfElement), sizeOfElement);
}
void排序(void*arr,int arrLength,int sizeOfElement,int(*比较)(void*,void*))
{
int i,j;
对于(i=0;i0)交换(((char*)arr+j*sizeOfElement),((char*)arr+(j+1)*sizeOfElement),sizeOfElement);
}
我通过调试器查看s1和s2

我做错了什么


谢谢。

对于阵列“e”,这是cmp:

    int cmpS1(void *aa,void *bb){
    int r;
    r=strcmp((char*)aa,(char*)bb);
    return r;
    }
对于阵列“d”,您需要此cmp:

int cmpS2(void *aa,void *bb){
    char* s1=*(char**) aa; char* s2=*(char**) bb;
    while(*s1 && *s2){
        if(*s1 > *s2) return 1;
        else if(*s2 > *s1) return -1;
        s1++;
        s2++;
    }
    return 0;
}

你怎么印的?也向我们展示代码。首先,如果您将“ca”和“cat”输入此函数,则逻辑不正确。不相同字符串的相同前缀将报告为相等;但它们不是。@MattMcNabb,我不这么认为,这里的函数在其中一个字符串完成后立即返回
0
。您对数组的转换已完全完成。
char*s1=*(char**)p1;char*s2=*(char**)p2