我相信他们的一些问题在你的代码:
您将size
传递给randomize()
,但您从不使用它。这将更好地做到:
size_t x = rand() % size;
size_t y = rand() % size;
而不是硬编码的64
大小值到这些行。
由于您正在交换指针,因此它们不需要创建临时缓冲区和指向它的指针。你可以简单地交换指针本身。我建议只使用一个功能是这样的:
void swap(char **s1, char **s2) {
char *temp = *s1;
*s1 = *s2;
*s2 = temp;
}
那么你可以简单地传递swap(&list[x], &list[y]);
交换你的指针。我不相信你的功能randomize()
需要返回char**
。如果仅仅是void
,那将更容易。
下面是一些测试代码,显示这一点:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARRAYSIZE(x) (sizeof x/sizeof x[0])
void randomize(char **list, size_t size);
void print_list(char **list, size_t size);
void swap(char **s1, char **s2);
int main(void) {
char *list[] = {"1 2 3", "3 2 1", "4 5 6", "6 5 4", "7 8 9", "9 8 7"};
printf("Original list:\n");
print_list(list, ARRAYSIZE(list));
randomize(list, ARRAYSIZE(list));
return 0;
}
void randomize(char **list, size_t size) {
size_t x, y;
srand(time(NULL));
for (size_t i = 0; i < size; i++) {
x = rand() % size;
y = rand() % size;
swap(&list[x], &list[y]);
printf("Swapping list[%zu] and list[%zu]:\n", x, y);
print_list(list, size);
}
}
void print_list(char **list, size_t size) {
printf("{");
for (size_t i = 0; i < size-1; i++) {
printf("%s, ", list[i]);
}
printf("%s}\n\n", list[size-1]);
}
void swap(char **s1, char **s2) {
char *temp = *s1;
*s1 = *s2;
*s2 = temp;
}
随机输出:
Original list:
{1 2 3, 3 2 1, 4 5 6, 6 5 4, 7 8 9, 9 8 7}
Swapping list[0] and list[4]:
{7 8 9, 3 2 1, 4 5 6, 6 5 4, 1 2 3, 9 8 7}
Swapping list[4] and list[1]:
{7 8 9, 1 2 3, 4 5 6, 6 5 4, 3 2 1, 9 8 7}
Swapping list[0] and list[1]:
{1 2 3, 7 8 9, 4 5 6, 6 5 4, 3 2 1, 9 8 7}
Swapping list[3] and list[3]:
{1 2 3, 7 8 9, 4 5 6, 6 5 4, 3 2 1, 9 8 7}
Swapping list[2] and list[1]:
{1 2 3, 4 5 6, 7 8 9, 6 5 4, 3 2 1, 9 8 7}
Swapping list[4] and list[1]:
{1 2 3, 3 2 1, 7 8 9, 6 5 4, 4 5 6, 9 8 7}
这是怎么排列声明并填充? –
如果您只是切换字符串,我不确定为什么您需要'strcpy'。你可以交换指针,这应该更容易。 –
该数组是malloc'd,每个元素都是malloc'd,然后使用sprinf写入数值。 http://pastebin.com/aRsAB8Wg – DAnsermino