对于初学者此声明
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
如果你逐行浏览这一行,你会看到有*无法做到这一点。 – Bathsheba
欢迎来到Stack Overflow!这听起来像你可能需要学习如何使用调试器来遍历代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。深入阅读:** [如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver
为什么在整个字符串周围复制时交换指针? – aschepler