字符串的冒泡排序功能会导致程序崩溃

时间:2013-04-09 14:12:35

标签: c string pointers bubble-sort

我不知道发生了什么,每次我在下面的代码中输入第二个字符串时,都会弹出一个错误框。我使用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;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:0)

从您的代码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);
}

修改

除了此更改之外,您还需要将simonc建议的更改合并到strcmp,即条件变为if(strcmp(name[j], name[j+1]) > 0),并将循环结构更改为for ( j = 0 ; j <i; j ++ ) 。除了上面malloc之外的这两个修改,您的代码将正常工作。

答案 1 :(得分:0)

正如对该问题的评论中所述,您需要为name元素分配内存。一种简单的方法是注意您将名称的长度硬编码为99个字符(传递给fgets的限制)并将数组更改为

char name[5][100];

一旦你这样做,你的字符串比较就不太对了。你能改变吗?

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

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

这将显示另一个错误。你的内循环可以运行到j=4。然后,当您访问name[j+1]时,可以读取/写入数组末尾。这里最简单的解决方法是将内循环更改为更快退出一次迭代

for (j=0 ; j<i; j++)
//          < rather than <=

答案 2 :(得分:0)

fgets(name [x],100,stdin);

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

char * name [5];

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

答案 3 :(得分:0)

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

char name[5][100];

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

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

此处,name是一个包含5个char *值的数组,大概长度为40个字节。这些指针中的每一个都指向堆上单独的100字节分配。您可以像上面name[5][100]一样引用缓冲区和字符,即使它是一个分配数组而不是二维数组。