我需要使用c中的动态记忆按字母顺序排列名字



目标是获得'n'个名称作为输入,并使用动态内存分配按字母顺序排列它们。如果我输入4个名字,代码运行良好。但如果我输入了5个以上,在我输入第五个名字后,代码就会被切断。即使我把n取为6,它也不接受第六个名字。有人能告诉我原因吗?解决方案是什么?代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char[], char[]);
int main()
{
char** name;
int i, n, j, y;
printf("Enter the number of names:");
scanf("%d", &n);
name = (char**)malloc(n * sizeof(char));
for (i = 0; i < n; i++)
{
name[i] = (char*)malloc(100 * sizeof(char));
}
printf("Enter the names:n");
for (i = 0; i < n; i++)
{
scanf("%s", *(name + i));
}
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
y = strcmp(name[i], name[j]);
if (y >= 0)
{
swap(name[i], name[j]);
}
}
}
for (i = 0; i < n; i++)
{
printf("%sn", name[i]);
}
return 0;
}
void swap(char a[], char b[])
{
char temp[20];
strcpy(temp, a);
strcpy(a, b);
strcpy(b, temp);
}

在该语句中,分配的内存大小被错误地指定为

name = (char**)malloc(n * sizeof(char));
^^^^^^^^^^^^

你必须写

name = (char**)malloc(n * sizeof(char *));   
^^^^^^^^^^^^^

交换功能通常不正确。对于初学者来说,不清楚为什么会使用神奇的数字20

char temp[20];

而所分配的字符阵列具有等于100的大小。

name[i] = (char*)malloc(100 * sizeof(char));

您只需要交换指向字符串的指针。例如,功能交换可以通过以下方式声明和定义

void swap( char **a, char **b )
{
char *temp = *a;
*a = *b;
*b = temp;
}

像一样被称为

swap( name + i, name + j );

此外,为了使输入更安全,您应该编写

scanf( "%99s", *( name + i ) );

请注意,当不再需要数组时,应该释放所有分配的内存。

最新更新