How does the following C program look to compare to strings and return a case-insensitive sort? The following is what I have so far:
int main(void)
{
char* strings[4] = {"Onus", "deacon", "Alex", "zebra"};
for (int i=0; i<4; i++) printf("%d. %s\n", i+1, strings[i]);
qsort(strings, 4, 8, scmp);
}
int scmp(const void *p1, const void *p2)
{
// being a string (pointer-to-char)
const char* s1 = *(char**) p1;
const char* s2 = *(char**) p2
size_t len_s1 = strlen(s1);
size_t len_s2 = strlen(s2);
// lower-case first string buffer
char s1_lower[len_s1+1]; // cannot initialize with {[len_s1]=0} in VLA ?
s1_lower[len_s1] = 0;
for (int i=0; s1[i] != 0; i++)
s1_lower[i] = tolower(s1[i]);
// lower-case second string buffer
char s2_lower[len_s2+1];
s2_lower[len_s2] = 0;
for (int i=0; s2[i] != 0; i++)
s2_lower[i] = tolower(s2[i]);
// built-in string compare (strcmp) will return the sort value
return strcmp(s1_lower, s2_lower);
/* printf("%s -- %s\n", s1_lower, s2_lower); */
}
Another version extracting out the str_lower
function would be:
void lower_string(char buffer[], const char* str, size_t len)
{
char str_lower[len+1];
str_lower[len] = 0;
for (int i=0; str[i] != 0; i++)
str_lower[i] = tolower(str[i]);
}
int scmp(const void *p1, const void *p2)
{
const char* s1 = *(char**) p1;
const char* s2 = *(char**) p2;
char s1_lower[strlen(s1)+1];
lower_string(s1_lower, s1, strlen(s1));
char s2_lower[strlen(s2)+1];
lower_string(s2_lower, s2, strlen(s2));
return strcmp(s1_lower, s2_lower);
}