2013-04-09 69 views
0

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

'fflush(stdin);'是一个未定义的操作......你在哪里分配内存来存储你正在阅读的这些字符串? – FatalError 2013-04-09 14:13:38

+0

name [x]是指针,需要分配内存。 – BLUEPIXY 2013-04-09 14:15:50

+0

能否请你在这个语句'strcmp(name [j]> name [j + 1])后面解释你的目标,因为这在语法上是不正确的。 – Ganesh 2013-04-09 14:19:49

回答

0

正如在问题的评论中指出的那样,您需要为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 <= 
+0

谢谢我的prb被解雇了.. – 2013-04-09 14:29:36

+0

获得的经验:你不能盲目猜测C语法,然后通过试错法找出类似程序的东西。程序员必须真正知道他们的代码中的每一行实际上做了什么。 – Lundin 2013-04-09 14:32:33

+0

@simonc ..虽然解决方案很好,但我不确定硬编码的长度是一个好主意。最初的问题是针对一系列指针,我觉得解决方案应该包含一个'malloc'。 – Ganesh 2013-04-09 14:35:36

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); 
} 

编辑:

从这一变化

除此之外,你需要把在strcmp通过simonc建议的修改即条件变得if(strcmp(name[j], name[j+1]) > 0)和循环结构,它更改为for (j = 0 ; j <i; j ++ )。除了上面的malloc以外的这2个修改,您的代码将正常工作。

0

与fgets(名[X],100,标准输入);

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

char * name [5];

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

0

您没有正确分配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维数组。