zoukankan      html  css  js  c++  java
  • 字符串数组排序(qsort参数 比较函数)

    这个问题来自一个面试题。

    给两个文件,其中一个文件存在一万行左右的文本,将所有数据以行为元素进行排序,输出到文件2中。

    拿到这个题,一看数据量大约一万行,内存应该没问题,感觉直接调用库函数qsort,写个cmp函数就

    很容易搞定,没想到调试程序发现了一个小问题。

    分析程序代码:

    const int MAXLINE = 100;
    const int MAXLEN = 256;
    int mycmp(const void *p1, const void *p2)
    {
     char* s1 = (char *)p1;
     char* s2 = (char *)p2;
     cout<<s1<<" "<<s2<<endl;
     return strcmp(s1, s2);
    }
    bool sort_file(char* file1, char* file2)
    {
     ifstream in(file1);
     if(!in)
     {
      cerr<<"open file1 failed"<<endl;
      return false;
     }
     char word[MAXLINE][MAXLEN];
    // char *word[MAXLINE];
     cout<<sizeof(word[0])<<endl;
     int line_num = 0;
     while(!in.eof())
     {
     /*
      char *tmp = new char[MAXLEN];
      in.getline(tmp, MAXLEN, '\n');
      word[line_num] = tmp;
     */
      in.getline(word[line_num], MAXLEN, '\n'); 
      line_num++;
     }
     ofstream out(file2);
     if(!out)
     {
      cerr<<"open file2 failed"<<endl;
      return false;
     }
        qsort(word, line_num, sizeof(word[0]), mycmp);
     int i = 0;
     while(i < line_num)
     {
      cout<<word[i]<<endl;
      out<<word[i++]<<'\n';
     }
     in.close();
     out.close();
     return true;
    }

    在这个代码中word为一个二维数组,那么每一个word[i]表示的其实是一个一维数组,我们知道如果使用一个char*来指向它的话,

    那么可以直接利用这个char*来代表这个数组,所以在cmp函数中使用的是char*,看下面的例子。

    版本二:

    int mycmp(const void *p1, const void *p2)
    {
     char** s1 = (char**)p1;
     char** s2 = (char**)p2;
     cout<<*s1<<" "<<*s2<<endl;
     return strcmp(*s1, *s2);
    }
    bool sort_file(char* file1, char* file2)
    {
     ifstream in(file1);
     if(!in)
     {
      cerr<<"open file1 failed"<<endl;
      return false;
     }
    // char word[MAXLINE][MAXLEN];
     char *word[MAXLINE];
     cout<<sizeof(word[0])<<endl;
     int line_num = 0;
     while(!in.eof())
     {
     
      char *tmp = new char[MAXLEN];
      in.getline(tmp, MAXLEN, '\n');
      word[line_num] = tmp;
     // in.getline(word[line_num], MAXLEN, '\n'); 
      line_num++;
     }
     ofstream out(file2);
     if(!out)
     {
      cerr<<"open file2 failed"<<endl;
      return false;
     }
        qsort(word, line_num, sizeof(word[0]), mycmp);
     int i = 0;
     while(i < line_num)
     {
      cout<<word[i]<<endl;
      out<<word[i++]<<'\n';
     }
     in.close();
     out.close();
     return true;
    }

    此时的word表示的是一个指针数组,每个word[i]就是一个char*,那么我们利用qsort的时候传递的是指向这个char* 的指针,即

    char**,所以在cmp中需要将void* --> char**,然后用*s来表示char*传递给strcmp。

    上面的例子说明,qsort 的比较函数中传递的是数组元素的指针,明白这个就很好理解了。

    重复一下qsort 的参数:

    void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
    
    base:指向第一个元素的指针,即数组首地址
    num:要排序的元素个数,及数组长度
    size:数组元素的大小,一般写成sizeof(base[0])
    comparator:自己写的比较函数了
  • 相关阅读:
    统计MySQL数据库硬盘占用量大小
    zookeeper 集群安装与配置
    On Java 8中文版 英雄召集令
    下划线参数转成驼峰
    在Ubuntu 18.04中安装JDK 8
    GIT和GitHub的使用总结
    Python目录
    selenium代码实例
    Fiddler请求图标含义
    Tensorflow之神经网络
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2444565.html
Copyright © 2011-2022 走看看