この宣言
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
この行を1行ずつ進めると、*これは動作しない*ことがわかります。 – Bathsheba
ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver
あなたはちょうどスワップポインタ? – aschepler