简体   繁体   English

通过交换指针对字符数组进行排序,C ++

[英]Sorting char arrays by swapping pointers, C++

I am trying to sort an array of char pointers (char * _string) by swapping pointers. 我正在尝试通过交换指针对char指针数组(char * _string)进行排序。

I have this method, and what I want to do is use the values I get from _string and sort them by not manipulating _string, but the empty helper array (char * _output) which I also hand over to the method. 我有这个方法,我想做的是使用从_string获得的值,并通过不操纵_string来对它们进行排序,而是将空的辅助数组(char * _output)也交给该方法。

Can anyone help me and tell me what I am doing wrong? 谁能帮助我,告诉我我做错了什么?

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

In my main-Method, I do something like this: 在我的主方法中,我做这样的事情:

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

After that code, I want the output array to contain the sorted values. 该代码之后,我希望输出数组包含排序后的值。

This sorts the string into an already allocated buffer, and if the buffer isn't large enough tells you how big it has to be: 这会将字符串排序到一个已经分配的缓冲区中,如果缓冲区不够大,则会告诉您它必须有多大:

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

This does the poor "allocate a new string" pattern, using the above implementation: 使用上面的实现,这会产生糟糕的“分配新字符串”模式:

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

And don't use variable names that start with an _ , it is a bad practice because it wanders really near compiler reserved names. 并且不要使用以_开头的变量名,这是一个不好的做法,因为它实际上徘徊在编译器保留的名称附近。 _Capital is reserved everywhere, and _lower in global scope, and foo__bar everywhere. _Capital在任何地方都保留,在全局范围内_lower在任何地方都保留foo__bar

Let's do the selection sort for a 10 size int array using pointer notation, you can simply change it to an array list. 让我们使用指针符号对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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM