下面是該程序的工作副本:
#include <cstdio>
#include <cstdlib>
#include <cstring>
char** bubble_sort(const char **filenames, int n)
{
int i;
char **new_list;
new_list = (char**) malloc(sizeof(*new_list) * n);
for (i = 0; i < n; i++)
{
new_list[i] = (char*) filenames[i];
}
printf("Initial list:\n");
for (i = 0; i < n; i++)
{
printf("%d: %s\n", i, new_list[i]);
}
int x;
int y;
printf("List is sorted:\n");
for(x=0; x<n; x++)
{
for(y=0; y<n-1; y++)
{
if(strcmp(new_list[y],new_list[y+1])>0)
{
char *temp = new_list[y+1];
new_list[y+1] = new_list[y];
new_list[y] = temp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d: %s\n", i, new_list[i]);
}
return new_list;
}
int main(){
const char *ar[5]={
"eee", "aaa", "bbb", "ccc", "ddd",
};
bubble_sort(ar, 5);
return (0);
}
但是,請記住,您的編程風格更類似於到C比C++(這並不總是一件壞事)。
如果您想爲您的數組元素分配新的字符串,你應該改變首先爲這樣的:
for (i = 0; i < n; i++)
{
//new_list[i] = (char*) filenames[i];
new_list[i] = (char*) malloc(sizeof(**new_list) * (strlen(filenames[i]) + 1));
strcpy(new_list[i], filenames[i]);
}
這是Ç版本(第一個是C++版本)。需要注意的是字符串數組有其所有元素新分配的,而不是使用初始字符串從輸入參數:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** bubble_sort(char **filenames, int n)
{
int i;
char **new_list;
new_list = malloc(sizeof(*new_list) * n);
for (i = 0; i < n; i++)
{
//new_list[i] = (char*) filenames[i];
new_list[i] = malloc(sizeof(**new_list) * (strlen(filenames[i]) + 1));
strcpy(new_list[i], filenames[i]);
}
printf("Initial list:\n");
for (i = 0; i < n; i++)
{
printf("%d: %s\n", i, new_list[i]);
}
int x;
int y;
printf("List is sorted:\n");
for(x=0; x<n; x++)
{
for(y=0; y<n-1; y++)
{
if(strcmp(new_list[y],new_list[y+1])>0)
{
char *temp = new_list[y+1];
new_list[y+1] = new_list[y];
new_list[y] = temp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%d: %s\n", i, new_list[i]);
}
return new_list;
}
int main(){
char *ar[5]={
"eee", "aaa", "bbb", "ccc", "ddd",
};
bubble_sort(ar, 5);
return (0);
}
我唯一的建議是,你使用std :: vector的。在不使用單個斷言檢查的情況下圍繞char **的並使用sizeof來玩是太頻繁的組合,這幾乎總是導致令人討厭的錯誤。而且,「malloc」?根據我的經驗,這在C++中幾乎是不需要的。如果你確實需要分配原始數組而不是使用std :: vector,那麼使用new []和delete [] - 這是你應該做的。 – 2010-07-06 14:51:58
如果我必須返回char **,該怎麼辦? (在這種情況下,我確實......我正在使用SDK並且需要char **) – Brandon 2010-07-06 14:53:37
使用STL容器進行所有操作,然後將結果複製到正確分配的char數組。例如:「char ** pp = new char [1000] [1000];」,但不能與malloc! – 2010-07-06 14:55:56