2017-04-11 68 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