2017-04-11 86 views
-2
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; 
    } 
} 

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

+0

如果你逐行浏览这一行,你会看到有*无法做到这一点。 – Bathsheba

+1

欢迎来到Stack Overflow!这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。深入阅读:** [如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

为什么在整个字符串周围复制时交换指针? – aschepler

回答

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:要比较的最大字符数。

+0

你的工作代码不显示排序的输出。你需要2个循环。我喜欢指针交换而不是strcpy。在将temp从char [50]更改为char *后,没有任何大小为50的理由。 –

+0

@RobertJacobs,谢谢,我忘了添加调试后的循环... – Rama

+0

你知道这是他们的家庭作业。有时最好提示一下,让他们自己解决。否则,他们可以使用C++ sort或c qsort。 –

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