C 字符串的气泡排序函数导致程序崩溃

C 字符串的气泡排序函数导致程序崩溃,c,string,pointers,bubble-sort,C,String,Pointers,Bubble Sort,我不知道发生了什么,每次我在下面的代码中输入第二个字符串,就会弹出一个错误框。我使用代码块作为编译器。是因为我使用指针对指针吗 #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++)

我不知道发生了什么,每次我在下面的代码中输入第二个字符串,就会弹出一个错误框。我使用代码块作为编译器。是因为我使用指针对指针吗

#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;
            }
        }
    }
}
#包括
#包括
无效排序字符串(字符**);
void main()
{
字符*名称[5];
int x=0;
printf(“输入名称”);
对于(x=0;x<5;x++)
{fflush(stdin);
fgets(名称[x],100,标准名称);
}
排序字符串(名称);
对于(x=0;x<5;x++)
{
出售(名称[x]);
}
}
无效排序字符串(字符*名称[5])
{
字符*温度;
int i,j;
对于(i=4;i>=0;i--)
{
对于(j=0;j名称[j+1]))
{
温度=名称[j+1];
名称[j+1]=名称[j];
名称[j]=温度;
}
}
}
}

从您的代码
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);
}
(x=0;x<5;x++)的

{
名称[x]=malloc(sizeof(char)*100);
fgets(名称[x],100,标准名称);
}
编辑:


除此更改外,您还需要将
strcmp
上的
simonc
建议的更改合并在一起,即条件变为
if(strcmp(name[j],name[j+1])>0
和循环结构,该循环结构被更改为
(j=0;j如问题注释所述,您需要为
name
元素分配内存。一个简单的方法是将名称的长度硬编码为99个字符(传递给
fgets
的限制),并将数组更改为

char name[5][100];
一旦你这样做了,你的字符串比较就不太正确了。你能改变吗

if (strcmp(name[j] > name[j+1]))

这将显示另一个错误。您的内部循环可以一直运行到
j=4
。然后,当您访问
name[j+1]
时,您可以在数组末尾之外进行读/写操作。这里最简单的修复方法是更改内部循环以更快地退出一个迭代

for (j=0 ; j<i; j++)
//          < rather than <=
用于(j=0;jfgets(名称[x],100,标准输入法)

您正在将其复制到未分配的内存中

字符*名称[5]

它将只创建大小为5的字符指针数组。
您必须初始化该指针的值。

您没有正确分配
name[]
。大多数现代语言都会为您分配字符串和其他内容,但C是老派语言,您需要自己管理它。有几种方法可以做到这一点

char name[5][100];
这将在堆栈上分配一个500字节长的本地二维数组。
name[0]
指分配开始时的一个100字符数组。
name[1][3]
指第二个100字符缓冲区中的第四个字符,它是
name
name[4]
中的第104个字节,是最后一个100字符数组

char *name[5];
int i;
for(i = 0; i < 5; i++) {
    name[i] = malloc(sizeof(char)*100);
}
char*name[5];
int i;
对于(i=0;i<5;i++){
名称[i]=malloc(sizeof(char)*100);
}

这里,
name
是一个由5个
char*
值组成的数组,可能有40字节长。这些指针中的每一个都指向堆上一个单独的100字节分配。您可以用与
name[5][100]相同的方式引用其中的缓冲区和字符
以上,即使它是一个分配数组而不是一个二维数组。

fflush(stdin);
是一个未定义的操作…你在哪里分配内存来存储你正在读取的字符串?name[x]是指针,需要分配内存。你能解释一下这句话背后的目的吗
strcmp(name[j]>名称[j+1])
因为这在语法上是不正确的。谢谢我的prb被解决了。经验教训:你不能盲目地猜测C语法,然后通过尝试和错误来修改类似于程序的东西。程序员必须真正知道他们代码中的每一行实际做了什么。@simonc。虽然解决方案很好,但我不确定硬编码的长度是否可行od想法。最初的问题是关于指针数组,我觉得解决方案应该包括
malloc
char *name[5];
int i;
for(i = 0; i < 5; i++) {
    name[i] = malloc(sizeof(char)*100);
}