使用指针数组按字母顺序排序

时间:2017-04-11 12:51:14

标签: c++ arrays sorting pointers c-strings

void sort(char *arr[])
{
    char temp[50];
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(strcmp(arr[i],arr[i+1])>0)
            {
                strcpy(temp,arr[i]);
                strcpy(arr[i],arr[i+1]);
                strcpy(arr[i+1],temp);
            }
        }
    }
}
int main()
{
    char *arr[] = {"zxe","pzae","cazaae","daanans"};    
    sort(arr);  
    for(int i=0; i<4; i++)  
    {
        cout<<arr[i]<<endl;
    }
}

我想使用此代码按字母顺序对字符串进行排序,但这似乎不起作用。我想专门为这个任务使用指针。任何线索?

3 个答案:

答案 0 :(得分:1)

你只需交换指针,只需从0迭代到2,因为你要与下一个值i+1进行比较

void sort(char *arr[])
{
    char * temp;
    for(int j=0; j<3;j++)
    {
        for(int i=0; i<3;i++)
        {
            if(strncmp(arr[i],arr[i+1],50)>0)
            {
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
    }
}

Working code

注意: 我使用strncmp因为它更安全,您可以指定n:要比较的最大字符数。

答案 1 :(得分:0)

比以前更小的内环。数组大小的参数。

 void sort(char *arr[], int size)
{
    char * temp;
    for(int j=0; j<size-1;j++)
    {
        for(int i=j+1; i<size; i++)
        { 
            if(strcmp(arr[i],arr[j])>0)
            {
            temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            }
        }
    }
}
int main()
{
char *arr[]={"zxe","pzae","cazaae","daanans"};  
sort(arr, size);  
for(int i=0; i<4;i++)   
{
    cout<<arr[i]<<endl;
}   
}

答案 2 :(得分:0)

对于初学者来说这个宣言

char *arr[] = {"zxe","pzae","cazaae","daanans"};

声明一个指向字符串文字的第一个字符的指针数组。在C ++中,字符串文字具有常量字符数组的类型,因此数组的正确声明应该类似于

const char * arr[] = { "zxe", "pzae", "cazaae", "daanans" };

对数组进行排序意味着重新排列作为指针的数组元素。字符串文字本身将保持不变。您只需要将指针交换为字符串文字而不是字符串文字。此外,字符串文字是不可变的。因此,无论如何,您可能无法在问题中显示的程序中执行您要执行的操作。你可以这样做,如果不是指向字符串文字的指针数组,你使用了二维字符串数组。也就是说,如果数组将被声明为例如

char arr[][8] = { "zxe", "pzae", "cazaae", "daanans" };

您可以使用标准C ++算法std::sort。例如

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstring>

int main() 
{
    const char * arr[] = { "zxe", "pzae", "cazaae", "daanans" };

    for ( const char *s : arr ) std::cout << s << ' ';
    std::cout << std::endl;

    std::sort( std::begin( arr ), std::end( arr ), 
               []( const char *s1, const char *s2 )
               {
                    return std::strcmp( s1, s2 ) < 0;
               } );

    for ( const char *s : arr ) std::cout << s << ' ';
    std::cout << std::endl;

    return 0;
}    

程序输出

zxe pzae cazaae daanans 
cazaae daanans pzae zxe 

如果要使用冒泡排序方法对数组进行排序,则程序可能看起来像

#include <iostream>
#include <utility>
#include <cstring>

void bubble_sort( const char * arr[], size_t n )
{
    for ( size_t last; not ( n < 2 ); n = last )
    {
        for ( size_t i = last = 1; i < n; i++ )
        {
            if ( std::strcmp( arr[i], arr[i - 1] ) < 0 )
            {
                std::swap( arr[i], arr[i - 1] );
                last = i;
            }
        }
    }
}

int main() 
{
    const char * arr[] = { "zxe", "pzae", "cazaae", "daanans" };
    const size_t N = sizeof( arr ) / sizeof( *arr );

    for ( const char *s : arr ) std::cout << s << ' ';
    std::cout << std::endl;

    bubble_sort( arr, N );

    for ( const char *s : arr ) std::cout << s << ' ';
    std::cout << std::endl;

    return 0;
}

程序输出与上面显示的相同

zxe pzae cazaae daanans 
cazaae daanans pzae zxe