精华内容
下载资源
问答
  • sort/qsort对字符串排序

    千次阅读 2015-03-30 18:22:56
    按照字典序排序: c++版: string s[21];  for(int i=0;i >s[i];  sort(s,s+20);不用写cmp函数,string 类提供了operator。但这只是按照字典序排序的,按长度排序如下: 按长度排序: c++版: #in

    转自:http://blog.sina.com.cn/s/blog_9159c90501016xer.html


    按照字典序排序:
    c++版:
    string s[21]; 
    for(int i=0;i <20;i++) cin>>s[i]
    sort(s,s+20);不用写cmp函数,string 类提供了operator。但这只是按照字典序排序的,按长度排序如下:
    按长度排序:
    c++版:
    #include<iostream>
    #include<cstring>
    #include <algorithm>
    using namespace std;
    bool cmp(string a,string b)
    {
        return a.length()<b.length();
    }
    int main()
    {
        int i,n;
        string s[25];
        while(cin>>n,n)
        {
            for(i=0;i<n;i++)
            cin>>s[i];
            sort(s,s+n,cmp);
            for(i=0;i<n;i++)
            cout<<s[i]<<endl;
         }
        return 0;
    }

    c语言版:
    int compare(const void*elem1,const void *elem2)
    {return(strcmp((char*)elem1,(char*)elem2));}
    qsort(str,size,len,compare);//str为char类型二维数组如str[1000][9], 那么,size是字符串的数目(1000), len是字符串的最长长度(9)
    展开全文
  • qsort是万能数组排序函数,必须要学会使用,简单的数组自然不用说,这里主要讨论一下字符串数组的使用。 首先看一下qsort的原型: void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *...
      qsort是万能数组排序函数,必须要学会使用,简单的数组自然不用说,这里主要讨论一下字符串数组的使用。
      首先看一下qsort的原型:
        void qsort(void *base, size_t nmemb, size_t size, 
    int(*compar)(const void *, const void *));
      正确使用这个函数要注意几点:
    1.base要传数组的首地址
    2.size传的是每个元素的大小
    3.正确编写compar函数
    
    下面是实际应用:
        一个字符串数组:*str[MAX],假设里面现在保存了n个字符串了。
        首先要正确理解什么是字符串数组,简单的说,可以理解成它就是一个数组,只不过其中的元素是一串字符串,而访问这些字符串,得用指针,也就是它们的地址,比如*name[]={"james","henry"},那么访问其中的字符串就是name[0],name[1]...这里就有个容易混淆的地方了,对于字符串数组,那么每个元素的大小到底是多少呢?对name[0]来说,到底是字符串“james”的长度5,还是char*的大小4呢?答案应该是4,因为字符串数组里面保存的是各个字符串的指针,所以回到上面所说的第二点注意,用qsort的时候应该要传sizeof(char *);
       第二,编写compar函数比较字符串有地方要注意:
           不能把strcmp本身传给qsort,即不能写strcmp(p,q),因为形参是const void*类型,同理,写成strcmp((char *)p, (char *)q);也是无效的;正确的写法应该是:strcmp(*(char **)p, *(char **)q);先强制转换成char**,在用*减少一层间接寻址操作:
          int compar_words(const void *p, const void *q)
          {
    return strcmp(*(char **)p, *(char **)q);
          }
    大家可以好好体会一下。对于上面的应用,最后使用qsort应该是这样:
    qsort(str, n, sizeof(char *), compar);
    由此可见,小小的一个qsort使用,对基本概念的理解得比较深刻。由此可见基础扎实的重要性^_^
        

    展开全文
  • C学习:qsort排序算法动态申请二维数组排序二维数组排序字符串排序 附:C代码在线调试工具 相关推荐: C学习:qsort快排函数在二维数组中的灵活应用 C学习:快排函数使用小结 qsort 由于动态申请的二维数组相邻...

    C学习:qsort排序算法对动态申请二维数组或字符串排序

    附:C代码在线调试工具

    相关推荐:
    C学习:qsort快排函数在二维数组中的灵活应用
    C学习:快排函数使用小结 qsort

    由于动态申请的二维数组相邻行的内存空间并不连续,所以会导致qsort()操作连续内存时有些变化,如不注意会导致报segment fault错误。对动态申请的不同字符串长度进行排序时,也有类似情况。下面结合实例代码进行分析。

    以下代码需包含头文件:

    #include <stdio.h>
    #include <stdlib.h>
    

    二维数组排序

    默认升序排序,按第一列大小作为依据对每行排序。要点如下:

    • 从代码中可以看出,需要注意修改qsort()的第3个参数元素的大小,要改成一级指针所占空间大小,以及对应的compar函数,因为输入的第一个参数是二级指针。
    • 此时,qsort()排序的本质是对连续分配内存的row个二级指针进行排序,从而交换每行一级指针的位置,并未对每行一级指针对应的内存进行操作。
    • 多个不同长度的字符串排序也是类似道理,只对字符串一级指针做交换排序。
    // 错误写法
    int CompareIntArray(const void *a, const void *b)
    {
        return (*(int *)a) - (*(int *)b);
    }
    
    // 正确写法,对二级指针解引用两次得到第一列值
    int CompareIntArray2(const void *a, const void *b)
    {
        return *(*(int **)a) - *(*(int **)b);
    }
    
    // Test 2D Array
    int main(void)
    {
        int a[5][3] = {{5,4,-1},{3,2,3},{7,3,-2},{-1,1,1},{4,0,1}};
    
        int row = 5;
        int col = 3;
    
        // 申请指向行首指针的二级指针空间
        int **arr2 = (int **)malloc(row * sizeof(int**));
        int i, j;
        for (i = 0; i < row; i++) { 
            // 得到行首指针,注意相邻行的内存空间不一定连续
            // 但同一行内部元素的内存空间是连续的
            arr2[i] = (int*)malloc(col * sizeof(int));
        }
    
        // 录入数据
        for (i = 0; i < row; i++) {
                for (j = 0; j < col; j++) {
                arr2[i][j] = a[i][j];  // 快速录入预设数据
                // int ret = scanf("%d", &arr2[i][j]);
                // if (ret != 1) { return -1; }
            }
        }
        arr2[2] = (int *)&b[0];  // 替换第3行数据
    
        // 打印输入的数组
        for (i = 0; i < row; i++) {
            for (j = 0; j < col; j++) {
                printf("%d ", arr2[i][j]);
            }
            printf("\n");
        }
    	printf("\n\n");
    	
    	// 常见错误调用,操作后打印时会报错
        // qsort(arr2, 5, 3 * sizeof(int), CompareIntArray); 
        // 正确调用,注意元素大小和compare函数
        qsort(arr2, row, sizeof(int*), CompareIntArray2); 
    
        // 打印排序后的数组
        for (i = 0; i < row; i++) {
            for (j = 0; j < col; j++) {
                printf("%d ", arr2[i][j]);
            }
            printf("\n");
        }
    
        // 释放对应内存
        for (i = 0; i < row; i++) {
        	// 当有 arr2[2] = (int *)&b[0]
        	// 注意不能释放arr2[2], 因为是从栈中申请的,不是在堆里动态申请来的内存
            free(arr2[i]);  
        }
        free(arr2);
       
        return 0;
    }
    

    输出效果:

    5 4 -1 
    3 2 3 
    10 3 1 
    -1 1 1 
    4 0 1 
    
    
    -1 1 1 
    3 2 3 
    4 0 1 
    5 4 -1 
    10 3 1
    

    字符串排序

    默认采用字典序排序。

    int CompareStr(const void *a, const void *b)
    {
        return strcmp((const char *)a, (const char *)b);
    }
    
    // 实际进来的是字符串二级指针
    int CompareStr2(const void *a, const void *b)
    {
        return strcmp(*(char **)a, *(char **)b);  // 取指向的一级指针对应字符串做比较
    }
    
    // Test 2D String
    int main(void)
    {
        const char *name[] = {"Jerry", "Tom", "Toby", "Ada"};       // 指针数组,name本质是二级指针
        const char name2[4][256] = {"Berry", "Tom", "Toby", "Ada"}; // 二维字符串数组,留冗余空间给每个字符串
    
        int row = 4;
        int col = 10;
    
        // 申请指向行首指针的二级指针空间
        char **str2 = (char **)malloc(row * sizeof(int**));
        int i, j;
        for (i = 0; i < row; i++) { 
            // 得到行首指针,注意相邻行的内存空间不一定连续
            // 但同一行内部元素的内存空间是连续的
            str2[i] = (char*)malloc(col * sizeof(char));
        }
    
        // 录入数据
        for (i = 0; i < row; i++) {
                // str2[i] = (char *)name[i];  // 快速录入预设数据
                str2[i] = (char *)name2[i];
        }
    
        // 打印输入的字符串
        for (i = 0; i < row; i++) {
            printf("%s\n", str2[i]);
        }
        printf("\n");
    
        // 错误调用,运行后printf时会报segment fault,说明错误操作了内存
        // qsort(str2, row, col * sizeof(int), CompareStr);
        // 正确调用,对字符串一级指针排序
        // row = sizeof(name) / sizeof(name[0]); // 得到指针个数
        qsort(str2, row, sizeof(char*), CompareStr2);  // 注意元素的空间大小要变成指针所占大小
    
        // 打印按字典序排序后的字符串
        for (i = 0; i < row; i++) {
            printf("%s\n", str2[i]);
        }
        printf("\n");
    
        // 释放对应内存
        for (i = 0; i < row; i++) { 
            free(str2[i]);
        }
        free(str2);
       
        return 0;
    }
    

    输出效果:

    Berry
    Tom
    Toby
    Ada
    
    Ada
    Berry
    Toby
    Tom
    

    重要说明:

    char *name[] = { "Toby", "Tony", ""Michael", "Canndy"};
    
    • *name[]定义了一个指针数组,数组里存着字符串常量对应的地址,name本质是个二级指针。
    • 可以通过 sizeof(name) / sizeof(name[0]),获得指针个数,sizeof(name)表示指针数组所占总空间, sizeof(name[0])表示一个指针所占空间。

    要点总结

    二级指针申请到的字符串或者数组如何有效排序?

    • 二级指针字符串,务必要保证连续的二级指针共n个,排序本质是对不同长度的字符串首地址的各指针进行排序
    • 二维数组本质也是如此,关键在于compar比较函数一些细节的写法

    参考资料

    1. 通俗易懂,直指本质:用qsort对字符串数组排序需要注意的几个问题
    展开全文
  • 我想用strcmp() 作为比较函数, 调用qsort() 一个字符串数组排序, 但是不行。 你说的“字符串数组” 实际上是“字符指针数组”。qsort 比较函数的参数是被排序对象的指针, 在这里, 也就是字符指针的指针。然而...
    我想用strcmp() 作为比较函数, 调用qsort() 对一个字符串数组排序, 但是不行。
    你说的“字符串数组” 实际上是“字符指针数组”。qsort 比较函数的参数是被排序对象的指针, 在这里, 也就是字符指针的指针。然而strcmp() 只接受字符指针。因此, 不能直接使用strcmp()。写一个下边这样的间接比较函数:
    /*  通过指针比较字符串 */
    int  pstrcmp(const  void  *p1,  const  void  *p2)
    {
    return  strcmp(*(char  *  const  *)p1,  *(char  *  const  *)p2);
    }
    比较函数的参数表示为“一般指针” const void *。然后, 它们被转换回本来表示的类型(指向字符指针的指针), 再复引用, 生成可以传入strcmp() 的char*。
    展开全文
  • /*用qsort()和bsearch()对字符串进行排序和查找*/ #include  #include  #include  #define MAX 20 int comp(const void *s1, const void *s2); int main(void){  char *data[MAX], buf[80], *...
  • 字符串排序

    2019-03-25 15:55:41
    该程序可以输入的字符串进行排序,windows中以Ctrl+z结束。程序的思路是利用指针数组,指向存储在alloc函数分配的空间中的字符串,使用Qsort函数进行比较。在Qsort函数中,将key也就是待回归的值变为指针变量来...
  • 利用冒泡排序法模拟qsort函数,列如int数组排序,struct数组排序,字符串排序,在以下函数参数里为了方便接收实参,形参给出了void *这种形式,至于函数的实现部分必须要强制转换为需要的类型。int Compare_int...
  • 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素。这个数组的元素个数由size指定。 compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体
  • qsort函数使用方法总结(详细全面+代码)

    千次阅读 多人点赞 2020-07-12 20:46:35
    文章目录qsort函数原型compar参数int 数组排序字符串数组排序字符串指针数组排序字符串二维数组排序整型二维数组 qsort函数原型 void qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void ...
  • 上学时我们很多学了很多种排序算法,不过在c++stl中也封装了sort等函数,头文件是#include <algorithm> 函数名 功能描述 sort 给定区间所有元素进行排序 stable_...
  • //strlen(word)是元素(存放字符串的字符数组)的大小 //compare_str是比较函数 for(i=0;i;i++) printf(" %s\n",str[i]); return 0; } int read_line(char s[],int n) { int ch,i=0; while((ch=getchar())!=...
  • qsort函数用法

    2010-08-30 11:01:00
    六类qsort排序方法 qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等。 以下是其具体分类及用法(若无具体说明是以降序排列): 1、一维数组排序: ...
  • C++实验题---字符串排序

    千次阅读 2013-08-20 16:38:47
    用指针实现N个字符串排序输出的程序,字符串按字符的ASCII依次排序。 输入 Line 1:一个整数N,表示有N个字符串; Line 2...N+1:一行一个字符串。 输出 Line 1...N
  • QT 中文字符串排序

    千次阅读 2011-05-10 14:28:00
    MeeGo 中文字符串排序 转自:http://www.cuteqt.com/blog/?p=1934<br /><br /><br />Qt类中的qSort()函数提供了对字符串的排序功能。要利用qSort为中文进行排序则需要我们提供一个针对中文比较规则的比较器。...
  • 本站所有文章由本站和原作者保留一切权力,仅在保留本版权...Qt类中的qSort()函数提供了对字符串排序功能。要利用qSort为中文进行排序则需要我们提供一个针对中文比较规则的比较器。 Meego Touch Framework...
  • qsort函数用法大全

    2010-10-12 19:12:00
    http://blog.donews.com/zuobj2004/archive/2005/10/10/583367.aspx<br />六类qsort排序方法    前一段时间做题觉得qsort函数很好用... 以下是其具体分类及用法(若无...
  • qsort是万能数组排序函数,必须要学会使用,简单的数组自然不用说,这里主要讨论一下字符串数组的使用。 首先看一下qsort的原型: 1 void qsort(void *base, size_t nmemb, size_t size, 2 i...
  • 2011-03-28 16:11:26| 分类: 默认分类 | 标签: |字号大中小 订阅六类qsort排序方法前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理...
  • C学习:qsort排序算法专用compare比较函数数组字符串结构体 相关推荐: C学习:qsort快排函数在二维数组中的灵活应用 C学习:快排函数使用小结 qsort 说明: qsort()被包含在头文件 <stdlib.h> 以下比较函数...
  • 之前发过的帖中,有讲到过结构体字符串进行排序的,除了手写之外,便想到用C/C++中的qsort结构体数组中的字符串进行排序。但是推广到sort中时,想了好久也没想明白,看看网上这样的帖也比较少,其实还是很好...
  • qsort对动态二维数组进行排序

    千次阅读 2014-08-20 08:58:02
    1,关于网上对于qsort函数对一维数组,二维数组(即字符串,形如char ch[2][6...)的排序的介绍比较常见,本文介绍了使用qsort函数对动态二维数组(即对字符串进行排序。形如:char**p=new char*[2]; p[0]=new char[6];str
  • C++ 字符串分割

    千次阅读 2019-10-14 18:11:01
    C++ 中经常需要对字符串按照指定字符或字符串进行分割操作以获得子串。下面给出具体实现。 版本一: //qsort函数需要的比较函数,按照升序排序 int comp(const void*a,const void*b) { return *(int*)a-*(int*)b; }...
  • qsort排序 转载

    2014-02-28 17:11:54
    前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。 以下是其具体分类及用法(若无具体说明是以降序排列): 1、一维数组排序: ...
  • qsort排序总结

    2011-12-14 11:00:31
    前一段时间做题觉得qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等,故通过查资料将其整理一番。 以下是其具体分类及用法(若无具体说明是以降序排列): 1、一维数组排序: ...
  • sort,qsort排序

    2019-09-29 04:10:30
    多个字符串排序,比较函数用strcmp写,如string数组存储的多个字符串 #include <cstdio> #include <iostream> #include <string> #include <algorithm> #include <cstring> using ...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

qsort函数对字符串排序