2012-02-13 17 views
-1

これまでのところ、このプログラムは2つの整数(ユーザ定義配列のサイズ)を取り込み、一度に1つの要素または文字を取り込み、アレイ。両方の配列がいっぱいになると、配列の1つをアルファベット順に並べる必要があります(これは組み込みの 'qsort'で行います)。qsortを使用してmalloced文字配列をcでソートする

しかし、このコードはqsortが呼び出されるとランタイムエラーに遭遇し、私の問題はそれをどうやって修正するのかわかりません。

マイコード:

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

それとも単に:

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

あなただけまっすぐにキャストを必要とするので、

#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; 
} 
+1

まず、Cでは 'malloc'(または他の暗黙の' void * 'ポインタのキャスト)の戻り値をキャストすることを強くお勧めします。 –

+0

なぜ、 'free()'を呼び出して割り当てられたメモリを解放しないのですか?プログラムが終了するので、 –

+0

php-coder? – Joey

答えて

0

XSequenceは、ただのcharポインタでありますあなたがそれを渡した場合、コードは動作します&XSequence、b余分なインダイレクションの必要はありません。

また、sizeof(char)、または要素サイズとして1を渡す必要があります。あなたはポインタをソートしていませんが、実際の文字です!

(私は、これは「それをoverthinking」の古典場合だと思います。あなたの実際のシナリオは、オン・鼻qsortのためのユースケース、古典である、そしてあなたはそれがあるよりも、それは方法より複雑になった。)

+0

これは実行時の問題を完全に解決しましたが、コードが "Xsequence"を印刷するprintコマンドに到達すると、何も表示されませんidk)。なぜ私の新しいソートされた文字列が見えないのか?編集:私はこれを提出した後、あなたの答えを更新しました。これ以上の説明は必要ありません。どうもありがとう! –

0
qsort (Xsequence, lengthX, sizeof(char*), compare); 

要素サイズとしてsizeof(char*)を渡していますが、Xsequenceの配列はcharであり、char*ではありません。代わりにsizeof(char)を渡す必要があります。

関連する問題