2012-11-22 2 views
0

나는 포인터를 교환하여 문자 포인터의 배열 (문자 * _string를) 정렬 할 노력하고 있어요.스와핑 포인터로 문자 배열을 정렬, C++

나는이 메소드를 가지고 있는데, _string에서 가져온 값을 사용하고 _string을 조작하지 않고 정렬하지만 빈 헬퍼 배열 (char * _output)은 메소드로 넘겨 준다.

사람이 나를 도와 내가 뭘 잘못 말해 줄래? 내가 출력 배열이 정렬 된 값을 포함하려면, 그 코드 후

char * string = {"bcdae"}; 
char * output = new char[5]; 
sortAsc(string, output); 

: 내 주요-방법에

void sortAsc(char* _string, char* _output) 
{ 

    int length = strlen(_string); 

     // output and string now point to the same area in the memory 
    _output = _string; 

    for(int i = 0; i < length; i++) { 
      for(int j = 0; j < length; j++) { 
       if(*(_output) > (_output[j])) { 

        // save the pointer 
        char* tmp = _output; 

        // now output points to the smaller value 
        _output = _output+j; 

        // move up the pointer to the smaller value 
        _output + j; 

        // now the pointer of the smaller value points to the higher value 
        _output = tmp; 

        // move down to where we were + 1 
        _output - j + 1; 

      } 
     } 
    } 

    //_output[length]='\0'; 

    //delete chars; 
} 

, 내가 이런 일을한다.

+0

? 받고있는 샘플 입력 및 출력 또는 오류를 제공하십시오. 후 –

+4

는'_output = _string' 당신이 함수에 전달 된 도우미 배열에 대한 참조를 잃게됩니다, 확실히이 도움이되지 않습니다. – Jack

+0

출력 변수를 컴파일 한 후 "abcde"여야합니다. 이 시점에서, 프로그램은 오류가 발생하지 않지만, 출력 변수는 메소드를 호출 한 후 단순히 여전히 비어 있습니다. –

답변

0

포인터 표기법을 사용하여 10 크기 int 배열에 대한 선택 정렬을 수행합니다. 간단히 배열 목록으로 변경할 수 있습니다.

순간에 그것을 잘못 무엇
 *---*---*---*---*---* ........ 
a[] = | 1 | 2 | 4 | 0 | 3 | ........ 
     *---*---*---*---*---* ........ 
     ^--------We start here looking for the smaller numbers and sort the array. 


for(i = 0; i < 10; i++){ 
    k = i; 
    bypass = *(a + i); 
    for(j = i + 1; j < 10; j++){ 

     /* To get Increasing order. */ 
     if(bypass > *(a + j)){ 
      bypass = *(a + j); 
      k = j; 
     } 
    } 
    if (k != i){ 
     *(a + k) = *(a + i); 
     *(a + i) = bypass; 
    } 
} 
0

이것은 이미 할당 된 버퍼로 문자열을 정렬하고, 버퍼 크기가 아닌 경우는, 그것을 충분히 있어야한다 얼마나 큰 당신을 알려줍니다

이 가난한을 수행
std::size_t sortAsc(char const* string, char* dest, std::size_t dest_length) { 
    std::size_t str_length = strlen(string); 
    char const* str_end = string + str_length; 
    if (dest_length < str_length+1) 
    return str_length+1; 
    std::copy(string, str_end, output); 
    output[str_length] = '\0'; 
    std::sort(output, output+strlen(output)); 
    return str_length+1; 
} 

"새로운 문자열을 할당"패턴을 위의 구현을 사용하여 : 정말 근처 컴파일러 예약 된 이름을 방황하기 때문에

char* allocate_and_sortAsc(char const* string) { 
    std::size_t str_length = strlen(string); 
    char* retval = new char[str_length+1]; 
    std::size_t count = sortAsc(string, retval, str_length+1); 
    ASSERT(count <= str_length); 
    return retval; 
} 

을하고 _로 시작하는 변수 이름을 사용하지 않는, 그것은 나쁜 방법입니다. _Capital 사방 예약, 사방 전역 범위에서 _lowerfoo__bar된다.

+0

@Abhishek 아니요, "버퍼의 마지막 문자를"\ 0 "으로 설정하지 않을 것입니다. 버퍼 오버플로/적절하게 종료하지 못하는 것은 C 코드의 가장 일반적인 보안 오류 중 하나입니다. – Yakk

+0

@oluies 왜 C++ 코드에서 편집을 승인합니까? 귀하의 프로필은 최소한 C++ 전문 지식을 보여주지 않습니다. – Yakk

관련 문제