2012-03-21 3 views
0

Я пытаюсь пузырь отсортировать массив символов в алфавитном порядке. Мой код выглядит следующим образом:пузырь сортировать массив символов в алфавитном порядке в c

#define CLASS_SIZE 10 
#include <stdio.h> 

void bubbleSortAWriteToB(const char a[], char *b[]); 

int main(void){ 
    char *s_letters[CLASS_SIZE]; 
    char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'}; 
    bubbleSortAWriteToB(letters,s_letters); 
     return 0; 
} 

void bubbleSortAWriteToB(const char a[], char *b[]){ 
    char temp; 
    int i,j; 
    for(i=0;i<CLASS_SIZE-1;i++){ 
     for(j=1;j<CLASS_SIZE;j++){ 
      if((int)a[j-1]>(int)a[j]){ 
       temp = a[j]; 
       *b[j] = a[j-1]; 
       *b[j-1] = temp; 

      } 

    } 

    } 
} 

Это не дает каких-либо ошибок, но когда я запускаю его он застревает, как это своего рода в цикле inifinte. Но из того, что я вижу, это не так. Можете ли вы мне помочь?

+0

Это не бесконечный цикл, [это ошибка сегментации] (HTTP: //codepad.org/7BwJOikP). –

+0

Что это значит? – Umut

+0

Это означает, что вы пытаетесь получить доступ к памяти, которой не должно быть. –

ответ

2

Закрепление код

Прежде всего, есть некоторые довольно серьезные фундаментальные проблемы, связанные с вашим кодом. Прежде чем мы справимся с этими проблемами, давайте просто исправим то, что у вас есть. Ваш цикл сортировки представлял собой половину сортировки массива и половину сортировки массива b. вы также никогда не инициализировали массив b для хранения каких-либо значений. Вот исправленная версия кода:

#define CLASS_SIZE 10 
#include <stdio.h> 

void bubbleSortAWriteToB(const char a[], char * b[]); 

int main(void){ 
    int i; 

    // initialize array 
    char * s_letters[CLASS_SIZE]; 
    char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'}; 
    // sort array 
    bubbleSortAWriteToB(letters,s_letters); 

    // print sorted array 
    for (i=0;i<CLASS_SIZE;i++){ 
     printf("%c\n", *s_letters[i]); 
    } 

    return 0; 
} 

void bubbleSortAWriteToB(const char a[], char * b[]){ 
    char * temp; 
    int i,j; 

    // initialize b array to hold pointers to each element in a 
    for (i=0;i<CLASS_SIZE;i++){ 
     b[i] = (char *)(a) + i; 
    } 

    // in-place sort the b array 
    for(i=0;i<CLASS_SIZE;i++){ 
     for(j=i+1;j<CLASS_SIZE-1;j++){ 
      if(*b[j-1]>*b[j]){ 
       temp = b[j]; 
       b[j] = b[j-1]; 
       b[j-1] = temp; 
      } 
     } 
    } 
} 

Исправление было инициализировать массив б с точками а, а затем отсортировать массив б на месте путем сравнения соответствующих значений в массиве.


Упрощая код

В исходном коде, стратегия должна была иметь массив указателей (б), которые указывают на элементы в а, а затем получить отсортированный. Здесь это было необязательно, потому что символы меньше указателей, поэтому пусть b - массив символов, более экономичный и простой в пространстве.

Кроме того, ваши интервалы были очень скрученными и несколько трудными для чтения. Вот решение, которое использует b как массив символов вместо указателей и предлагает улучшенный интервал. Кроме того, объявление функции выше не было необходимым. Достаточно определить функцию и объявить ее один раз.

#define CLASS_SIZE 10 
#include <stdio.h> 

void bubbleSortAWriteToB(const char a[], char b[]){ 
    char temp; 
    int i,j; 

    // initialize b array to hold pointers to each element in a 
    for (i = 0; i < CLASS_SIZE; i++){ 
     b[i] = a[i]; 
    } 

    // in-place sort the b array 
    for(i = 0; i < CLASS_SIZE; i++){ 
     for(j = i + 1; j < CLASS_SIZE - 1; j++){ 
      if(b[j-1] > b[j]){ 
       temp = b[j]; 
       b[j] = b[j-1]; 
       b[j-1] = temp; 
      } 
     } 
    } 
} 

int main(void){ 
    int i; 

    // initialize array 
    char s_letters[CLASS_SIZE]; 
    char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'}; 

    // sort array 
    bubbleSortAWriteToB(letters, s_letters); 

    // print sorted array 
    int i; 
    for (i = 0; i < CLASS_SIZE; i++){ 
     printf("%c\n", s_letters[i]); 
    } 

    return 0; 
} 
1

Я собирал это с gcc -g и побежал через Valgrind, и получил это:

==54446== Non-existent physical address at address 0x100000000 
==54446== at 0x100000EB0: bubbleSortAWriteToB (x.c:20) 
==54446== by 0x100000DFE: main (x.c:9) 

Line 20 это:

*b[j] = a[j-1]; 

char *b[] представляет собой массив указателей char, но вы пытаясь поместить что-то в указатели, не инициализируя их. Если вы действительно хотите сделать это, вам нужно:

b[j] = malloc(sizeof(*b[j])); // Create some space for a char 
*b[j] = a[j-1]; // Put the char in that space 

Но, я не думаю, что это то, что вы на самом деле хотите. Если вы просто измените его на char b[] и удалите все свои *, он отлично работает.

+0

Я использовал указатель только для практических целей. – Umut

+1

Создание этих указателей означает, что вы не выделили массив символов, чтобы помещать ваши данные, но массив char *. Не то же самое. –

+0

@ UmutŞenaltan Читать [этот вопрос] (http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation), чтобы увидеть, как сделать указатель на массив символов. –

1

Ваш s_letters не инициализирован, пока вы к нему доступ в:

*b[j] = a[j-1]; 
*b[j-1] = temp; 

Это выдаёт ошибку сегментации.

0

Bubble рода

консоли: Входной сигнал: "face321" выход: "123acef"

#include <stdio.h> 

int main(){ 

    char c[80] = "0"; 
char temp = '0'; 
int offSet = 0; 
int i = 0; 
int j =0; 
int count =0; 

printf("Enter first string: "); 
gets(c); 

while (*(c + offSet) != '\0') { 
    count++; 
    offSet++; 
} 



for (i = 0; i < count; i++) { 
for (j = 0; j < count - 1; j++) { 


    if (c[j]>c[j + 1]) { 

     temp = c[j]; 
     c[j] = c[j + 1]; 
     c[j + 1] = temp; 

    } 

} 

} 
    puts(c); 
    return 0; 
} 
Смежные вопросы