2012-03-21 2 views
0

알파벳 배열로 버블 정렬하려고합니다.버블 문자 배열을 영문자 순으로 정렬하십시오.

#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 어레이를 초기화하고 A 배열에 대응하는 값을 비교하여 현재 위치에서 상기 B 배열을 정렬하는 것이다. 원래 코드에서 코드

을 단순화


, 전략 (b)는 다음의 요소를 가리킨 것이라고이 정리 될 포인터의 배열을 가지고 있었다. 문자가 포인터보다 작기 때문에 여기서는 불필요합니다. 따라서 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의를 통해 실행하고,이있어 :

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

char *b[]char 포인터의 배열입니다,하지만 당신은 위치 : 라인 20

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

을 이것이다 포인터를 초기화하지 않고 포인터에 넣으려고합니다. 이 작업을 실제로 수행하려면 다음을 수행해야합니다.

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 배열을 할당하지 않았지만 char * 배열을 배치했다는 것을 의미합니다. 거의 같은 것은 아닙니다. –

+0

@ UmutŞenaltan char 배열에 대한 포인터를 만드는 방법을 보시려면 [이 질문에] (http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation)을 읽어보십시오. –

1

는 귀하의 s_letters가 제대로 초기화, 아직 당신은에 액세스되지 않은 : 그것은 segfault의의

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

.

0

버블 종류의

콘솔 : 출력 "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; 
} 
관련 문제