C - сортировка строк по алфавиту без использования функции strcmp()

Я пишу небольшую программу на C, которая должна сортировать строки, разделенные запятыми, в алфавитном порядке.

Ввод выглядит следующим образом: «ФСКТ», «ЭОРД», «ОСЭА», «ДА», «ЕРТС», «ВГ», «ФХР», «ЭИАС», «ДОД».

Это рабочий код, который выполняет сортировку:

#include <stdio.h>
#include <string.h> 
int main() {
    char *a[] = {"FSKT","EORD","OSEA","DA","ERTS","VG","FHR","EIAS","DOD"};
    const char *s1,  *s2;
    int compRes,i,j;
    int length = 9;
    for (i = 0; i < length; i++) {
        for (j = i+1; j < length; j++){
            s1 = a[i];
            s2 = a[j];
            compRes = 0;
            while(*s1 && *s2){              
                if(*s1!=*s2){               
                    compRes = *s1 - *s2;     
                    break;                   
                }                           
                ++s1;
                ++s2;
            }
            if (compRes > 0 || (compRes == 0 && *s1)) {
                char* temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
        printf("%s ", a[i]);

    }
    printf("\n");
    return 0;
}

Я не использую strcmp() или что-то в этом роде, потому что он должен оставаться очень простым для последующего перевода. Теперь я хотел бы использовать scanf() для входной строки, и если точка достигнута, ввод должен остановиться. Как-то я уже застрял на входе...

Это моя попытка до сих пор, к сожалению, она не работает.:

 #include <stdio.h>
    #include <string.h> 
    int main() {

        int compRes;
        int i;
        int j;
        int length = 9;
        char *s1;
        char*s2;
        char a[10][10] = { 0,0,0,0,0,0,0,0,0,0};

        //scan all strings separated with a comma

        scanf("%4[^,],%4[^,],%4[^,],%4[^,],%4[^,],%4[^,],%4[^,],%4[^,],%4[^,]" ,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);



            for (i = 0; i < length; i++) {
                for (j = i+1; j < length; j++){
                    s1 = a[i];
                    s2 = a[j];
                    compRes = 0;
                    while(*s1 && *s2){
                        if(*s1!=*s2){
                            compRes = *s1 - *s2;
                            break;
                        }
                        ++s1;
                        ++s2;
                    }
                    if (compRes > 0 || (compRes == 0 && *s1)) {
                        char* temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }

                }
                printf("%s ", a[i]);

            }
            printf("\n");
            return 0;
        }

Кто-нибудь может мне помочь?

Заранее спасибо.


person jack11    schedule 23.03.2014    source источник
comment
не могли бы вы объяснить немного больше о мотивации отказа от использования strcmp   -  person amdixon    schedule 23.03.2014
comment
программа должна быть позже переведена на язык ассемблера.   -  person jack11    schedule 23.03.2014
comment
Почему бы не создать собственную функцию mystrcmp() и не использовать ее вместо нее?   -  person wildplasser    schedule 23.03.2014


Ответы (1)


Проблема не в сканировании, а в следующих строках:

                char* temp = a[i];
                a[i] = a[j];
                a[j] = temp;

Предыдущий код отлично работает для массива указателей и не работает для двумерного массива символов. Я бы удивился, если бы он вообще скомпилировался. В основном у вас есть два варианта исправления вашей программы.

Вы можете отсканировать строки в двумерный массив и установить правильные указатели на исходный одномерный массив указателей, и программа останется прежней. То есть:

    char b[10][10] = { 0,0,0,0,0,0,0,0,0,0};
    char *a[10];
    for(i=0; i<length; i++) a[i] = b[i];

Или вам нужно будет скопировать целые строки при обмене. То есть:

               char temp[10];
               strcpy(temp, a[i]);
               strcpy(a[i], a[j]);
               strcpy(a[j], temp);
person Marian    schedule 23.03.2014