對於初學者此聲明
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