Given the following code, why does the last function sortAccordingToFunction sometimes omit the last word or puts a comma at the beginning? I am limited to using cstring
int compareTwoWordsLowerAndCh(const void *a, const void *b) {
const char *first = *(const char *const *) a;
const char *second = *(const char *const *) b;
char lowerFirst[strlen(first)];
char lowerSecond[strlen(second)];
strcpy(lowerFirst, first);
strcpy(lowerSecond, second);
toLower(lowerFirst);
toLower(lowerSecond);
if (strncmp(lowerFirst, "ch", 2) == 0) {
if (strncmp(lowerSecond, "ch", 2) == 0) {
return strcmp(lowerFirst, lowerSecond);
}
if (lowerSecond[0] <= 'h') {
return 1;
}
return -1;
}
if (strncmp(lowerSecond, "ch", 2) == 0) {
if (lowerFirst[0] <= 'h') {
return -1;
}
return 1;
}
return strcmp(lowerFirst, lowerSecond);
}
void sortWordsInSmallAndCh(char *listOfWords[], int count) {
qsort(listOfWords, count, sizeof(char *), compareTwoWordsLowerAndCh);
}
const char *sortAccordingToFunction(const char *text, char *output, void sortingFunction(char *arraysOfText[], int count)) {
if (text == nullptr || output == nullptr || numberOfWords(text) == 0) {
return "";
}
char **buffer = new char *[numberOfWords(text)];
for (int i = 0; i < numberOfWords(text); i++) {
buffer[i] = new char[256];
copyNthWord(text, buffer[i], i);
}
sortingFunction(buffer, numberOfWords(text));
memset(output, 0, strlen(output));
bool needComma = false;
for (int i = 0; i < numberOfWords(text); i++) {
if (needComma) {
strcat(output, ",");
}
strcat(output, buffer[i]);
needComma = true;
}
for (int i = 0; i < numberOfWords(text); i++) {
delete[] buffer[i];
}
delete[] buffer;
return output;
}