user-0 提问: 字符串排序问题

回复:
user: user-1
content: // 哈哈，我是找来找岔的， // 这么多的高手，对题目的理解有问题！没仔细看题目的后果！ // 在这里只指出错误之处，上面的人已经指出了没有释放内存的错误，这里不再指出了！！！！ // 这里不对你的原程序的写法作出置评   #include<stdio.h> #include<string.h> #include<stdlib.h>  char *a[2000];  int main(void) {      char *p;      int i, k, n;       scanf("%d", &n);       for(i = 1; i < (n+1); i++){          a[i]=(char*)malloc(sizeof(char)*2000);          memset(a[i], 0, sizeof(char)*2000);      }       for(i = 1; i < (n+1); i++)          scanf("%s",a[i]);       for(i = 1; i < (n+1); i++)      {          for(k = i+1; k < (n+1); k++)              if(strcmp(a[i],a[k])>0)              {                  p       = a[k];                  a[k]    = a[i];                  a[i]    = p;              }      }       for(i = 1; i < (n+1); i++)              printf("%s\n",a[i]);  // Hi, 你忘记释放内存了！我就不帮你写了，你自己补上吧！                return 0;  }  程序在Ubuntu 14.04上测试通过， astron@ubuntu:~$ uname -a Linux ubuntu 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux  GCC Version: astron@ubuntu:~$ gcc -v gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

user: user-2
content: 来看看~表示学习学习。。。

user: user-3
content: 引用 8 楼 u013951943 的回复:[quote=引用 6 楼 a515360208 的回复:] 你的代码除了动态申请后没有释放，没有其他问题 如果你做的是ACM的题目的话，估计就是超时或者内存的问题了，你把没有通过的原因贴出类 错误显示就是runtime error 有人说是内存的问题，可是我不知道问题出在什么地方，后面我释放了空间也不行[/quote] ACM题的话，就无能无力了，跟本身的的编译器有关系吧，我也不太懂

user: user-4
content: a[i]=(char*)malloc(sizeof(char)*2000);这里申请了内存，后面没有释放。指针一定要记住申请后不用时就将他释放。

user: user-5
content: 菜鸟路过，无能为力

user: user-6
content: 1 #include<stdio.h>   2 #include<stdlib.h>   3 #include<string.h>   4 struct  node;   5 typedef  struct tree   6 {   7         struct  node *p_node;   8 }tree;   9 typedef struct node  10 {  11         struct  tree p_left;  12         struct  tree p_right;  13         char *p_data;  14 }node;  15 tree tr;  16 void init()  17 {  18         tr.p_node=NULL;  19 }  20 static tree *find_tree(tree *p_tree ,const char *str)  21 {  22         if(!p_tree->p_node||!strcmp(p_tree->p_node->p_data,str))  23         {  24                 return p_tree;  25         }  26         if(strcmp(p_tree->p_node->p_data,str)>0)  27         {  28                 return find_tree(&p_tree->p_node->p_left,str);  29         }  30         return find_tree(&p_tree->p_node->p_right,str);  31 }  32 void add_data(const char *str)  33 {  34         char *p_str=(char *)malloc(strlen(str)+1);  35         memcpy(p_str,str,strlen(str)+1);  36         node *p_node=(node *)malloc(sizeof(node));  37         p_node->p_left.p_node=NULL;  38         p_node->p_right.p_node=NULL;  39         p_node->p_data=p_str;  40         if(!tr.p_node)  41         {  42                 tr.p_node=p_node;  43                 return;  44         }  45         find_tree(&tr,str)->p_node=p_node;  46 }  47 void erg_tree(const tree *p_tree)  48 {  49         if(!p_tree->p_node)  50         {  51                 return;  52         }  53         erg_tree(&p_tree->p_node->p_left);  54         printf("%s\n",p_tree->p_node->p_data);  55         erg_tree(&p_tree->p_node->p_right);  56         free(p_tree->p_node->p_data);  57         free(p_tree->p_node);  58 }  59 int main()  60 {  61         init();  62         char buff[100];  63         size_t  i=0;  64         for(;i<10;i++)  65         {  66                 gets(buff);  67                 add_data(buff);  68         }  69         printf("*************************************\n");  70         erg_tree(&tr);  71         return 0;  72 } 二叉树实现了一下

user: user-7
content: 不要假设malloc都能成功，不要假设N < 2000,不要假设2000个字节足够容纳一行内容。

user: user-8
content: 引用 11 楼 u013951943 的回复:[quote=引用 9 楼 u012061345 的回复:] 字符串最长是多少？ 如果是2000的话，内存要开2001。 这个不要紧，原题对大小没有要求，2000只是我随便弄的[/quote]  这个说不定很要紧。你弄份AC的代码来看看。

user: user-0
content: 引用 9 楼 u012061345 的回复:字符串最长是多少？ 如果是2000的话，内存要开2001。 这个不要紧，原题对大小没有要求，2000只是我随便弄的

user: user-0
content: 引用 2 楼 yangyuyu77584 的回复:a[i]=(char*)malloc(sizeof(char)*2000);这里申请了内存，后面没有释放。指针一定要记住申请后不用时就将他释放。 恩 可是后来我释放了还是有问题

user: user-8
content: 字符串最长是多少？ 如果是2000的话，内存要开2001。

user: user-0
content: 引用 6 楼 a515360208 的回复:你的代码除了动态申请后没有释放，没有其他问题 如果你做的是ACM的题目的话，估计就是超时或者内存的问题了，你把没有通过的原因贴出类 错误显示就是runtime error 有人说是内存的问题，可是我不知道问题出在什么地方，后面我释放了空间也不行

user: user-0
content: 错误显示就是runtime error 有人说是内存的问题，可是我不知道问题出在什么地方，后面我释放了空间也不行

user: user-3
content: 你的代码除了动态申请后没有释放，没有其他问题 如果你做的是ACM的题目的话，估计就是超时或者内存的问题了，你把没有通过的原因贴出类

user: user-9
content: qsort Performs a quick sort.  void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );  Routine Required Header Compatibility  qsort <stdlib.h> and <search.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameters  base  Start of target array  num  Array size in elements  width  Element size in bytes  compare  Comparison function  elem1  Pointer to the key for the search  elem2  Pointer to the array element to be compared with the key  Remarks  The qsort function implements a quick-sort algorithm to sort an array of num elements, each of width bytes. The argument base is a pointer to the base of the array to be sorted. qsort overwrites this array with the sorted elements. The argument compare is a pointer to a user-supplied routine that compares two array elements and returns a value specifying their relationship. qsort calls the compare routine one or more times during the sort, passing pointers to two array elements on each call:  compare( (void *) elem1, (void *) elem2 );  The routine must compare the elements, then return one of the following values:  Return Value Description  < 0 elem1 less than elem2  0 elem1 equivalent to elem2  > 0 elem1 greater than elem2    The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of “greater than” and “less than” in the comparison function.  Example  /* QSORT.C: This program reads the command-line  * parameters and uses qsort to sort them. It  * then displays the sorted arguments.  */  #include <stdlib.h> #include <string.h> #include <stdio.h>  int compare( const void *arg1, const void *arg2 );  void main( int argc, char **argv ) {    int i;    /* Eliminate argv[0] from sort: */    argv++;    argc--;     /* Sort remaining args using Quicksort algorithm: */    qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );     /* Output sorted list: */    for( i = 0; i < argc; ++i )       printf( "%s ", argv[i] );    printf( "\n" ); }  int compare( const void *arg1, const void *arg2 ) {    /* Compare all of both strings: */    return _stricmp( * ( char** ) arg1, * ( char** ) arg2 ); }   Output  [C:\code]qsort every good boy deserves favor boy deserves every favor good   Searching and Sorting Routines  See Also   bsearch, _lsearch

user: user-9
content: 为什么不用qsort函数呢、

user: user-10
content: 你觉得有什么不妥？或者运行会出错？