我需要在 c 中使用动态内存按字母顺序排列名称
I need to arrange names in alphabetical order using dynamic memory in c
目标是获取 'n' 个名称作为输入,并使用动态内存分配按字母顺序排列它们。如果我输入 4 个名称,代码工作正常。但是如果我输入超过 5 个,代码会在我输入第五个名字后中断。它不接受第 6 个名字,即使我给 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("%s\n", 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));
你需要的只是交换指向字符串的指针。例如,可以通过以下方式声明和定义函数 swap
void swap( char **a, char **b )
{
char *temp = *a;
*a = *b;
*b = temp;
}
并称赞
swap( name + i, name + j );
另外为了让输入更安全你应该写
scanf( "%99s", *( name + i ) );
注意当数组不再需要时,你应该释放所有分配的内存。
目标是获取 'n' 个名称作为输入,并使用动态内存分配按字母顺序排列它们。如果我输入 4 个名称,代码工作正常。但是如果我输入超过 5 个,代码会在我输入第五个名字后中断。它不接受第 6 个名字,即使我给 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("%s\n", 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));
你需要的只是交换指向字符串的指针。例如,可以通过以下方式声明和定义函数 swap
void swap( char **a, char **b )
{
char *temp = *a;
*a = *b;
*b = temp;
}
并称赞
swap( name + i, name + j );
另外为了让输入更安全你应该写
scanf( "%99s", *( name + i ) );
注意当数组不再需要时,你应该释放所有分配的内存。