【问题标题】:Sorting list array of strings in C在C中对字符串列表数组进行排序
【发布时间】:2017-10-28 15:02:07
【问题描述】:
#include <stdio.h>
#include <string.h>

void ascending_sort(char *name, char **pName, unsigned int size);

int main(){
   char * names[] = {"Ellin","Alexa","Eliza","Celiza", NULL};
ascending_sort(names[0],names,( sizeof(names)/sizeof(char *)) - 1);
return 0;
}

void ascending_sort(char *name, char **pName, unsigned int size){
    unsigned int i;
    unsigned int z;
    int keep;
    char temp;
    /// print out the array
    for (i = 0; i < size; i++)
    {
        printf("str: %s\n", pName[i]);
    }

    ///start sorting...
    for (i = 0; i < size; i++){
        keep = i;
        for(z = i; z < size; z++){
            if(pName[keep]>pName[z]){
               keep = z;
            }
        }
        temp = pName[i];
        pName[i] = pName[keep];
        pName[keep] = temp;

    }
    for (i = 0; i < size; i++){
        printf("str: %s\n", pName[i]);
    }
}

我对双指针(char**)感到困惑。 如何使用'for'循环打印出函数中数组的每个元素(以便我可以轻松理解)并对其进行排序(使用'for'循环)?

帮助修复我的排序算法,它不起作用

【问题讨论】:

  • 你自己搜索过什么吗?
  • 打印每个元素进行调试,你可以简单地做,例如void ascending_sort (char **pName, int size) { int i; for (i = 0; i &lt; size; i++) printf (" %s\n", pName[i]); }注意:您不需要传递char *name。实际上,由于您在 names 的末尾提供了 sentinel NULL,因此您甚至不需要传递 size,例如void ascending_sort (char **pName) { while (*pName) printf (" %s\n", *pName++); }注意:要保留指向 pName 开头的指针,请使用单独的指针来遍历名称)
  • 您需要使用 strcmp() 函数进行比较。请参阅下面的示例。

标签: c arrays string list sorting


【解决方案1】:

一个char **,是一个指向字符指针的指针。没有索引的数组名被视为指向数组中第一个元素的指针。您的数组是字符指针(指向其他地方内存中的字符串文字)。所以指向第一个元素的指针是指向字符指针的指针,或 char **。如下图,函数参数也可以指定为char *pnames[],这样更好的体现了它是一个字符指针的数组(大小未知)。如果传递大小,则 for 循环最有意义。

#include <stdio.h>
#include <string.h>

void ascending_sort(char *name,char *pname[]);    
void ascending_sort2(char *name,char **pnames,unsigned int size);    

int main(){
   char *names[] = {"Dnames", "Bnames", "Anames", "Cnames", NULL};
   ascending_sort(names[0],names);
   ascending_sort2(names[0],names,( sizeof(names)/sizeof(char *)) - 1);
   ascending_sort2(names[0],names,(4));
return 0;
}

void ascending_sort(char *name,char *pname[]){
     //print out list of array
     // calculate array size
     unsigned int i = 0;
     char **ptemp = pname;
     while(*ptemp)  {
    i++;
        ptemp++;
     }
     unsigned int size = i;
     printf("------- 1 ----------\n");
     for (i = 0; i < size; i++)
     {
        printf("str: %s\n", pname[i]);  
     } 
     //start sorting...
}

void ascending_sort2(char *name,char **pnames, unsigned int size){
     //print out list of array
     unsigned int i,z;
     printf("------- 2 ---------\n");
     for (i = 0; i < size; i++)
     {
         printf("str: %s\n", pnames[i]);
     }
     //start bubble sorting...
     for( i = 0; i < (size - 1); i++)
     {
        for ( z = i; z < (size - 1); z++)
        {    
           if ( strcmp(pnames[z],pnames[z+1]) > 0 )
           {
              // swap the pointers
              char * temp = pnames[z+1];
              pnames[z+1] = pnames[z];
              pnames[z] = temp;
           }
        }
     }

     printf("--- after bubble sort: --------\n");
     for (i = 0; i < size; i++)
     {
         printf("str: %s\n", pnames[i]);
     }
}

【讨论】:

    【解决方案2】:

    使用 stdlib 中的 qsort 可能不是您想要的。但是下面的示例代码可能会清除 (char **) 指针的使用:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int compare (const void * ca, const void * cb)
    {
        char **a = (char **)ca;
        char **b = (char **)cb;
        return strcmp(*a, *b);
    } 
    
    int main()
    {
         int numnam, j;
         char *names[] = {"Ellin","Alexa","Eliza","Celiza"};
         numnam = sizeof(names)/sizeof(char *);
         qsort(names, numnam, sizeof(char *), compare);
         for (j = 0 ; j < numnam; j++)
             printf("%s \n", names[j]);
    return 0;
    }
    

    【讨论】:

      【解决方案3】:

      固定 99.99%... !!

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
          void sort_name(char **pName, char order[], unsigned int size);
      
      int main()
      { 
          char *names[] = {"Ellin","Alexa","Eliza","4-C", NULL};
      
          printf("[1] ");
          sort_name(names, "asc", (sizeof(names)/sizeof(char *))-1);
      
          return 0;
      }
      
      void sort_name(char **pName, char order[], unsigned int size){
      
           unsigned int i;
           unsigned int z;
      
           ///print out
           printf("Original list:\n\t");
           for (i = 0; i < size; i++)
           {
               (i<size-1) ? printf(" %s,", *(pName+i)) : printf(" %s\n", *(pName+i));
           }
      
           ///start sorting...
           if (!strcmp(order,"asc")){
                  printf("    Ascending sorted list:\n\t");
           for (i=0; i <size; i++){
               for(z=i+1; z<size; z++){
                   if(strcmp(*(pName+i),*(pName+z))>0){
                      char *temp = *(pName+i);
                      *(pName+i) = *(pName+z);
                      *(pName+z) = temp;
                   }
               }
           }
           for (i = 0; i < size; i++){
               (i<size-1) ? printf(" %s,", *(pName+i)) : printf(" %s\n", *(pName+i));
               }
           }
      
           else if (!strcmp(order,"desc")){
                  printf("    Descending sorted list:\n\t");
           for (i=0; i <size; i++){
               for(z=i+1; z<size; z++){
                   if(strcmp(*(pName+i),*(pName+z))<0){
                      char *temp = *(pName+i);
                      *(pName+i) = *(pName+z);
                      *(pName+z) = temp;
                   }
               }
      
           }
           for (i = 0; i < size; i++){
               (i<size-1) ? printf(" %s,", *(pName+i)) : printf(" %s\n", *(pName+i));
               }
           }
      
           else{
              printf(" That doesnt even make sense!");
           }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-26
        • 2012-09-13
        • 1970-01-01
        • 2013-12-31
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        相关资源
        最近更新 更多