0

ポインタを交換して、charポインタの配列(char * _string)を並べ替えようとしています。

私はこのメソッドを持っています。私がやりたいのは、_stringから取得した値を使用し、_stringを操作せずに、メソッドに渡す空のヘルパー配列(char * _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;
 }

私のメインメソッドでは、次のようなことをします。

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

そのコードの後で、出力配列にソートされた値が含まれるようにします。

4

2 に答える 2

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

于 2012-11-22T22:03:30.540 に答える
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;
    }
}
于 2012-11-23T10:20:00.993 に答える