字符串的气泡排序功能导致程序崩溃
我不知道发生了什么,每当我在下面的代码中输入第二个字符串时,弹出一个错误框。我使用Codeblocks作为编译器。是因为我使用指针指针吗?字符串的气泡排序功能导致程序崩溃
#include<stdio.h>
#include<conio.h>
void sort_string(char **) ;
void main()
{
char *name[5] ;
int x =0;
printf("Enter Names");
for(x = 0 ; x < 5 ; x++)
{ fflush(stdin);
fgets(name[x], 100, stdin);
}
sort_string(name);
for(x = 0 ; x < 5 ; x++)
{
puts(name[x]);
}
}
void sort_string(char *name[5])
{
char *temp;
int i , j ;
for (i = 4 ; i >=0; i--)
{
for (j = 0 ; j <=i; j ++ )
{
if(strcmp(name[j] > name[j+1]))
{
temp = name[j+1];
name[j+1] = name[j];
name[j] = temp;
}
}
}
}
正如在问题的评论中指出的那样,您需要为name
元素分配内存。一个简单的方法是要注意,你硬编码的名称到99个字符(传递给fgets
极限)和长度改变你的数组
char name[5][100];
一旦你这样做,你的字符串比较是不太对。你可以改变
if (strcmp(name[j] > name[j+1]))
到
if (strcmp(name[j], name[j+1]) > 0)
这将显示另一个bug。你的内循环可以运行到j=4
。当您访问name[j+1]
时,您可以在阵列末尾读取/写入数据。最简单的解决这里将是改变内环退出一次迭代越早
for (j=0 ; j<i; j++)
// < rather than <=
从代码char *name[5]
定义5
字符数组的数组。因此,当您执行fgets(name[x], 100, stdin);
时,由于name[x]
是一个指针,因此预计内存分配给name[x]
。因此,代码可以修改
for(x = 0; x < 5; x++)
{
name[x] = malloc(sizeof(char) * 100);
fgets(name[x], 100, stdin);
}
编辑:
从这一变化除此之外,你需要把在strcmp
通过simonc
建议的修改即条件变得if(strcmp(name[j], name[j+1]) > 0)
和循环结构,它更改为for (j = 0 ; j <i; j ++ )
。除了上面的malloc
以外的这2个修改,您的代码将正常工作。
与fgets(名[X],100,标准输入);
您正在将其复制到未分配的内存中。
char * name [5];
它只会创建大小为5的字符指针数组。 您必须初始化该指针的值。
您没有正确分配name[]
。大多数现代语言都会为你分配字符串和事物,但C是老派,你需要自己管理它。有几种方法可以做到这一点。
char name[5][100];
此分配堆栈的本地2维阵列500个字节长上。 name[0]
在分配开始时引用一个100个字符的数组。 name[1][3]
是指第二个100字符缓冲区中的第四个字符,它是name
中的第104个字节。 name[4]
是最后的100个字符数组。
这里,name
是5个char *
值,大概40个字节长的阵列。这些指针中的每一个都指向堆上的单独100字节分配。您可以像上面的name[5][100]
一样引用它们中的缓冲区和字符,即使它是一个分配数组而不是一个2维数组。
'fflush(stdin);'是一个未定义的操作......你在哪里分配内存来存储你正在阅读的这些字符串? – FatalError 2013-04-09 14:13:38
name [x]是指针,需要分配内存。 – BLUEPIXY 2013-04-09 14:15:50
能否请你在这个语句'strcmp(name [j]> name [j + 1])后面解释你的目标,因为这在语法上是不正确的。 – Ganesh 2013-04-09 14:19:49