简体   繁体   中英

Compare function for std::sort sort C-strings

Here is I what I am doing, basically sort an array of dynamically generated C-Strings, it's going to be a combination of "abc", and the length is less than 5 for the sake of brevity. What is confusing/interesting is how to configure the compare function so it won't compare the C-strings by memory addresses

srand ( time(NULL) );
char alpha[] = "abc";
char** CString = new char*[either 5 or 1000];
unsigned int j=0;
for (unsigned int i=0; i<either 5 or 1000;i++) {
    int ran = rand() % 5 + 2;
    CString[i] = new char[ran];
    for(j=0;j<ran-1;j++){
        CString[i][j] = alpha[rand() % (sizeof(alpha) - 1)];
    }
    CString[i][ran-1] = '\0';
}

std::sort(CString,CString+either 5 or 1000,SortCompare);

for(int i=0;i<5;i++){
    std::cout << *(CString+i) << " at " << CString+i << std::endl;
}

now I have three configurations for the compare function

int SortCompare(char* a,  char* b){
    //return a<b;
    //return *a<*b;
    //return strcmp(a,b);
}

and the printout was

return strcmp(a,b):
CRASHED! //bummed because I had high hope for this

return a<b:
(when 5 C-strings):                        (when 1000 C-strings):
abba at 001F3248                           cbccb at 00544388 
bcb at 001F324C                            caac at 0054438C
cbb at 001F3250                            bcbc at 00544390
c at 001F3254                              ac at 00544394
ca at 001F3258                             a at 00544398
//conclusion: it's sorted by addresses. so turning head to the other one

return *a<*b:
(when 5 C-strings):                        (when 1000 C-strings):
abba at 001F3248                           cbccb at 00544388
bcb at 001F324C                            caac at 0054438C
cbb at 001F3250                            bcbc at 00544390
c at 001F3254                              ac at 00544394
ca at 001F3258                             a at 00544398
//I assumed it's value-sorted              //seriously hurt, belief has been destroyed seeing the memory addresses line up so neatly

Therefore, which one is the correct version to sort by value? Or I am totally on a wrong track. Needed a life guard! Thanks

If you never have any NULL pointers:

bool SortCompare(char const* const a, char const* const b)
{
    return std::strcmp(a, b) < 0;
}

If you do have NULL pointers, it's only slightly more verbose:

bool SortCompare(char const* const a, char const* const b)
{
    return a && (!b || std::strcmp(a, b) < 0);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM