2016-05-12 3 views
0

私はCで文字の配列をソートしようとしています。私のバブルソートアルゴリズムは標準ですが、sortメソッドを使って配列を印刷しようとすると、空であるようです。Bubble Sortは配列を空にします

これは私のポインタの使用に問題がありますか?

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

char Gstr1[256]; 
char Gstr2[256]; 

void load(); 
void printArrays(); 
void sortArray(char *array); 

main() 
{ 

    load(); 
    printArrays(); 
    sortArray(&Gstr1[0]); 
    sortArray(&Gstr2[0]); 
    printf("\n\n"); 
    printArrays(); 
} 

void load() 
{ 
    memcpy (Gstr1,"Sed aliquam neque fermentum leo semper sagittis. Curabitur imperdiet, libero vulputate laoreet tristique, magna justo posuere, quis rutrum ligula tortor vitae eros. Phasellus sed dignissim elit, nec dictum ligula. Vivamus ornare ultrices odio eget dictum.",255); 

    memcpy (Gstr2,"Lorem ipsum dolor si amet, consectetur adipiscing elit. Aenean dapibus libero a convallis sodales. Mauris placerat nisl leo, vitae tincidunt turpis tristique in. Pellentesque vehicula nisl vitae efficitur ornare. Nunc imperdiet sem, in aliquam rhoncus at.",255); 
} 

void printArrays() 
{ 
    printf(Gstr1); 
    printf("\n\n"); 
    printf(Gstr2); 
} 

void sortArray(char *array) 
{ 
    int i,j; 
    char temp; 

    for(i=0;i<(256-1);i++) 
     for(j=0;j<(256-i-1);j++) 
     { 
      if((int)*(array+j)>(int)*(array+(j+1))) 
      { 
       temp=*(array+j); 
       *(array+j)=*(array+(j+1)); 
       *(array+(j+1))=temp; 
      } 
     } 
} 
+0

配列の最初の文字\ 0'' ' 'となりました。適切に並べ替える範囲を設定します。 – MikeCAT

+1

無関係ですが、標準ではありません。 Bubblesortは既にソートされたリストでO(n)の最善のケースを持っています。あなたのコードは*展示されません。 – WhozCraig

答えて

1

これが原因で、文字列の長さです。最初の文字列の長さは256で、2番目の文字列の長さは257で、 '\ 0'文字の世話はしていません。したがって、memcpy()の代わりにmemcpy_s()を使用し、forループの配列サイズをハードコーディングする代わりにstrlen()を使用することをお勧めします。しかし、forループ制限を少し修正すると、次のコードが出力を生成します。

コード:

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

char Gstr1[256]; 
char Gstr2[256]; 

void load(); 
void printArrays(); 
void sortArray(char *array); 

main() 
{ 

    load(); 
    printArrays(); 
    sortArray(&Gstr1[0]); 
    sortArray(&Gstr2[0]); 
    printf("\n\n"); 
    printArrays(); 
} 

void load() 
{ 
    memcpy (Gstr1,"Sed aliquam neque fermentum leo semper sagittis. Curabitur imperdiet, libero vulputate laoreet tristique, magna justo posuere, quis rutrum ligula tortor vitae eros. Phasellus sed dignissim elit, nec dictum ligula. Vivamus ornare ultrices odio eget dictum.",255); 

    memcpy (Gstr2,"Lorem ipsum dolor si amet, consectetur adipiscing elit. Aenean dapibus libero a convallis sodales. Mauris placerat nisl leo, vitae tincidunt turpis tristique in. Pellentesque vehicula nisl vitae efficitur ornare. Nunc imperdiet sem, in aliquam rhoncus at.",255); 
} 

void printArrays() 
{ 
    printf(Gstr1); 
    printf("\n\n"); 
    printf(Gstr2); 
} 

void sortArray(char *array) 
{ 
    int i,j; 
    char temp; 

    for(i=0;i<strlen(array);i++) 
     for(j=0;j<(strlen(array)-i-1);j++) 
     { 
      if((int)*(array+j)>(int)*(array+(j+1))) 
      { 
       temp=*(array+j); 
       *(array+j)=*(array+(j+1)); 
       *(array+(j+1))=temp; 
      } 
     } 
} 
0

配列内の最後の文字もソートし、ソートされた文字配列の先頭にNULL終端記号を付けます。
したがって、次のようにループを調整して問題を解決してください。もちろん
は、パラメータで、配列のサイズを渡す方が良いでしょうが、それは別のトピックだ:)

void sortArray(char *array) 
{ 
    int i,j; 
    char temp; 

    for(i=0;i<(256-2);i++) 
     for(j=0;j<(256-i-2);j++) 
     { 
      if((int)*(array+j)>(int)*(array+(j+1))) 
      { 
       temp=*(array+j); 
       *(array+j)=*(array+(j+1)); 
       *(array+(j+1))=temp; 
      } 
     } 
} 
関連する問題