2016-05-12 3 views
0

Я пытаюсь сортировать массив символов в C. Мой алгоритм сортировки пузырьков является стандартным, но когда я пытаюсь распечатать массивы после использования метода сортировки, они кажутся пустыми.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, а вторая - 257, и вы не заботитесь о символе «\ 0». Следовательно, рекомендуется использовать memcpy_s() вместо memcpy(), а также использовать strlen() вместо hardcoding размер массива в циклах for. Тем не менее, при незначительной коррекции предела цикла 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

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

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; 
      } 
     } 
}