Тема: Сортування масиву із покажчиками на рядкові константи
Вітаю форумчани.
Я майже доробив програмку, яка б виконувала поставлене завдання, ось вона:
/* 
 * File:   main.cpp
 * Author: YaR
 *
 * Created on November 19, 2013, 12:04 PM
 */
#include <cstdlib> 
#include <iostream>
#include <cstring>
#define MAXLINES 50
using namespace std;
/*
 * 
 */
char *wArrayPtr[MAXLINES]; // Масив покажчиків на рядкові константи
void arrayFill(char *array_ptr, int size); // заповнення масиву
int arraySort(char *array_ptr, int size); // перетворення рядку на масив векторів
void my_qsort(void *v[], int left, int right, 
        int(*comp)(void *, void *)); // сортування масиву покажчиків
int strcmp_t(char *s1, char *s2); // алфавітне порівняння двох рядкових констант
void swap(void *v[], int i, int j); // зміна двох елементів масиву місцями
int main(int argc, char** argv) {
    int count;
    char nameOfStates[1000];
    
    arrayFill(nameOfStates, sizeof(nameOfStates));
    cout << "Array was filled by this text:\n" << nameOfStates << '\n';
    
    count = arraySort(nameOfStates, sizeof(nameOfStates));
    cout << "Main function:\n";
    cout << wArrayPtr[0] << "\n";
    cout << wArrayPtr[1] << "\n";
    return 0;
}
void arrayFill(char *array_ptr, int size){
    int i = 0;
    char statesNames[] = "Virginia\n"
                         "Texas\n"
                         "Oregon\n"
                         "Alabama\n"
                         "Dakota\n"
                         "California\n"
                         "Utah\n"
                         "Florida\n"
                         "Georgia\n"
                         "Pennsylvania\n"
                         "New Mexico\n"
                         "Nevada\n"
                         "Montana\n"
                         "\0" ;
    
    // Заповнення масиву
    while(i < size && statesNames[i] != '\0'){
        *array_ptr = statesNames[i++];
        array_ptr++;
    }
    
    // Видалення незакінченого слова
    if(*array_ptr != '\0'){
        while(*array_ptr != '\n' && i!=0){
            array_ptr--;
            i--;
        }  
    }
    
    // Додавання нуль-символу в кінець рядку
    if(*array_ptr == '\n'){
        array_ptr++;
    }
    *array_ptr = '\0';
}
int arraySort(char *array_ptr, int size){
    int i, j, k; // i - загальний лічильник для проходження по масиву
                       // j - номер слова із яким ми працюємо
                       // k - індекс для другого виміру масиву
    int count=0; // count - кількість слів в рядку
    
    // Розрахунок кількості слів
    i = 0;
    while(*(array_ptr+i) != '\0'){
        if(*(array_ptr+i) == '\n'){
            count++;
        }
        i++;
    }
    
    cout << "Number of words in array: " << count << "\n";
    
    char wordArray[count][30]; // Ініціалізація масиву векторів
    
    // Встановлення покажчиків на рядкові константи
    i = 0;
    j = 0;
    k = 0;
    while(*(array_ptr+i) != '\0'){
        if(*(array_ptr+i) != '\n'){
            wordArray[j][k] = *(array_ptr+i); // Запис слова в векторний масив
            k++;
        } else {
            wordArray[j][k] = '\0'; // Заміна переносу каретки на нуль-символ
            wArrayPtr[j] = wordArray[j];
            j++; // Новий вектор
            k=0;
        }
        i++;
    }
    
    // Сортування масиву
    my_qsort((void **) wArrayPtr, 0, count-1, (int (*)(void*, void*)) (strcmp_t));
    cout << "Array_sort function:\n";
    cout << wArrayPtr[0] << "\n";
    cout << wArrayPtr[1] << "\n";
    
    return count;
}
void my_qsort(void *v[], int left, int right, int(*comp)(void *, void *)){
    int i, last;
    void swap(void *v[], int i, int j);
    if (left >= right) /* do nothing if array contains */
        return; /* fewer than two elements */
 
    swap(v, left, (left + right)/2);
    last = left;
    
    for (i = left+1; i <= right; i++)
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);
    
    swap(v, left, last);
    my_qsort(v, left, last-1, comp);
    my_qsort(v, last+1, right, comp);
}
int strcmp_t(char *s1, char *s2){
    for( ; *s1 == *s2; s1++, s2++)
        if(*s1 == '\0')
            return 0;
    return *s1 - *s2;
}
void swap(void *v[], int i, int j){
    void *temp;
    
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}Вивід програми такий:
Array was filled by this text:
Virginia
Texas
Oregon
Alabama
Dakota
California
Utah
Florida
Georgia
Pennsylvania
New Mexico
Nevada
MontanaNumber of words in array: 13
Array_sort function:
Alabama
California
Main function:
;RUN SUCCESSFUL (total time: 103ms)
Я не розумію, чому в main() відбувається інший вивід, поясніть будь ласка.