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

この行を1行ずつ進めると、*これは動作しない*ことがわかります。 – Bathsheba

+1

ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

あなたはちょうどスワップポインタ? – aschepler

答えて

1

あなたは次の値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

と比較しているので、あなたが注意、ポインタのみを交換する必要があり、ちょうど2に0から反復:それはあるので、私は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"}; 

は、文字列リテラルの最初の文字へのポインタの配列を宣言します。配列の正しい宣言は、配列はポインタで配列の要素を再配置することを意味ソートするには

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

ようになっているはずですので、C++の文字列リテラルでは、一定の文字配列のタイプがあります。文字列リテラル自体は変更されません。必要なのは、文字列リテラルではなく、文字列リテラルへのポインタをスワップすることだけです。さらに文字列リテラルは不変です。だからあなたの質問に表示されているプログラムで何をしようとしているのか分からないかもしれません。文字列リテラルへのポインターの配列の代わりに、2次元配列のストリングを使用した場合は、これを行うことができます。配列は、あなたが標準C++アルゴリズムstd::sortを使用することができます

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

のように、たとえば宣言するならばそれはあります。例えば

#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 
関連する問題