используя qsort для сортировки массива некорректных символов в c - PullRequest
0 голосов
/ 13 февраля 2012

Эта программа до сих пор имеет одну цель: взять два целых числа (размер пользовательских массивов), а затем по одному элементу или символу за раз и добавить их в массив.Как только оба массива заполнены, один из массивов должен быть в алфавитном порядке (я пытаюсь сделать это с помощью встроенного qsort).

Однако этот код обнаруживает ошибку времени выполнения после вызова qsort, и моя проблема в том, что я не знаю, почему или как это исправить.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int toExit(int exit){
    while(exit != 1 || exit !=2){

        printf("\n\nPlease Choose:\n1) Exit\n2) Run program again\nYour choice: ");
        scanf("%d", &exit);
        printf("\n");

        switch(exit){
        case 1:
            return exit;
        case 2:
            return exit;
        default:
            printf("That is not one of the given options.\n\n");
        }
    }

}    

int compare(const void *a, const void *b){

    const char* a1 = *(const char**)a;
    const char* b1 = *(const char**)b;
    return strcmp(a1,b1);
}  

int main(void) {

    int exit=0, i, j;
    int lengthX, lengthA;
    char *Xsequence, *Asequence, *_$;

    while(exit != 1){


    printf("please enter the length of sequence A: ");
    scanf("%d", &lengthA);
    printf("please enter the length of sequence X: ");
    scanf("%d", &lengthX);

    printf("\n");  //spacing, visual look of the program

    Asequence =(char*) malloc(lengthA*sizeof(char));
    Xsequence =(char*) malloc(lengthX*sizeof(char));

    for(j=0;j<=lengthA-1;j++)
    {
        printf("Element %d of A: ",j+1);
        scanf("%s", &Asequence[j]);
    }

    printf("Last Element of A (looking for \"$\"): ");
    scanf("%s", &_$);
    printf("\n");  //spacing, visual look of the program

    for(j=0;j<=lengthX-1;j++)
    {
        printf("Element %d of X: ",j+1);
        scanf("%s", &Xsequence[j]);
    }

    printf("Last Element of X (looking for \"$\"): ");
    scanf("%s", &_$);
    printf("\n");  //spacing, visual look of the program

    qsort (Xsequence, lengthX, sizeof(char*), compare);
    printf("The \"A\" sequence is: %s\n",Asequence);
    printf("The \"X\" sequence is: %s\n",Xsequence);


    exit = toExit(exit);

    }
// return 0; 
}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012
qsort (Xsequence, lengthX, sizeof(char*), compare);

Вы передаете sizeof(char*) в качестве размера элемента, но Xsequence - это массив char, а не char*. Вы должны передать sizeof(char) вместо.

0 голосов
/ 13 февраля 2012

XSequence - это просто указатель на символ, поэтому вам нужно только прямое приведение:

const char * a1 = (const char *) a;
const char * b1 = (const char *) b;

Или просто:

return strcmp((const char *) a, (const char *) b);

Ваш код будет работать, если вы передадите его &XSequence, но нет необходимости в дополнительном косвенном указании.

Вам также нужно передать sizeof(char), или просто 1, в качестве размера элемента.Вы не сортируете указатели, а действительные символы!

(я думаю, что это классический случай «переосмысления». Ваш реальный сценарий - классический вариант «на носу» для qsort, и высделал это намного сложнее, чем есть.)

...