如何用qsort对二维字符数组存的若干字符串排序?

我写了一个程序,有点问题:

#include

#include

#include

int qsort_compare_str_asc(const void *a, const void *b);

char *s[5]=     {"cattle","car","banana","cabet","cap"};

char t[5][100]= {"cattle","car","banana","cabet","cap"};

int main()

{

int i;

printf("s升序排列:\n");

qsort((void*)s, 5, sizeof(char *), qsort_compare_str_asc);

for(i=0; i<5; i++)

printf("%s\n",s[i]);

printf("t升序排列:\n");

qsort((void*)t, 5, sizeof(char *), qsort_compare_str_asc);

for(i=0; i<5; i++)

printf("%s\n",t[i]);

return 0;

}

int qsort_compare_str_asc(const void *a, const void *b)

{

return strcmp(*(char**)a, *(char**)b);

}

程序运行结果:

s是字符指针数组,字符串升序排序成功

t是二维字符数组,字符串升序排序直接崩溃

请教高手:像t[5][100]这样用二位字符数组存储的若干字符串如何用qsort排序成功?

------解决思路----------------------

t[i]是指针常量,不能作为左值。所以会在qsort交换数组元素位置时出错。

要qsort排序的话,可以把t的每个元素赋给一个字符指针数组,就像s。

------解决思路----------------------

引用:我可以另外设一个字符指针数组char *pt[5] = {t[0],t[1],t[2],t[3],t[4]}

下面只需要用qsort对pt排序,最后pt[0]、pt[1]、……指向的字符串就是有序的。

现在带来一个问题:

如果数据量很大,比如100万个字符串,额外加400万字节的指针,会不会消耗内存很厉害?

如果我想在pt排序完之后再写段代码让t有序,会不会是多此一举?

100万个字符串,明显会内存消耗很利害,要考虑其它 的方法了。比如hash.

是多此一举。

------解决思路----------------------

仅供参考//文件1中的内容排序并去重,结果保存到文件2中

#include

#include

#include

#define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0

int MAXLINES=10000,MAXLINES2;

char *buf,*buf2;

int c,n,hh,i,L;

FILE *f;

char ln[MAXCHARS];

int ignore_case=0;

int icompare(const void *arg1,const void *arg2) {

return stricmp((char *)arg1,(char *)arg2);

}

int compare(const void *arg1,const void *arg2) {

return strcmp((char *)arg1,(char *)arg2);

}

int main(int argc,char **argv) {

if (argc<3) {

printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");

printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);

return 1;

}

if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写

f=fopen(argv[1],"r");

if (NULL==f) {

printf("Can not find file %s!\n",argv[1]);

return 1;

}

buf=(char *)malloc(MAXLINES*MAXCHARS);

if (NULL==buf) {

fclose(f);

printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);

return 2;

}

n=0;

hh=0;

i=0;

while (1) {

if (NULL==fgets(ln,MAXCHARS,f)) break;//

hh++;

L=strlen(ln)-1;

if ('\n'!=ln[L]) {//超长行忽略后面内容

printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);

while (1) {

c=fgetc(f);

if ('\n'==c

------解决思路----------------------

EOF==c) break;//

}

}

while (1) {//去掉行尾的'\n'和空格

if ('\n'==ln[L]

------解决思路----------------------

' '==ln[L]) {

ln[L]=0;

L--;

if (L<0) break;//

} else break;//

}

if (L>=0) {

strcpy(buf+i,ln);i+=MAXCHARS;

n++;

if (n>=MAXLINES) {

MAXLINES2=MAXLINES*2;

if (MAXLINES2==1280000) MAXLINES2=2500000;

buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);

if (NULL==buf2) {

printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);

printf("WARNING: Lines >%d ignored.\n",MAXLINES);

break;//

}

buf=buf2;

MAXLINES=MAXLINES2;

}

}

}

fclose(f);

if (n>1) {

if (ignore_case) qsort(buf,n,MAXCHARS,icompare);

else qsort(buf,n,MAXCHARS,compare);

}

f=fopen(argv[2],"w");

if (NULL==f) {

free(buf);

printf("Can not create file %s!\n",argv[2]);

return 2;

}

fprintf(f,"%s\n",buf);

if (n>1) {

if (ignore_case) {

hh=0;

L=MAXCHARS;

for (i=1;i

if (stricmp((const char *)buf+hh,(const char *)buf+L)) {

fprintf(f,"%s\n",buf+L);

}

hh=L;

L+=MAXCHARS;

}

} else {

hh=0;

L=MAXCHARS;

for (i=1;i

if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {

fprintf(f,"%s\n",buf+L);

}

hh=L;

L+=MAXCHARS;

}

}

}

fclose(f);

free(buf);

return 0;

}

------解决思路----------------------

如果数据量很大的话,那一般在读取的时候不会用指针常量存的。而且数据量大的时候内存都会出问题,一般采用外部排序。

------解决思路----------------------

数据量大的话可以做归并排序

将数据按10万分段做排序,结果存储到文件中,然后作多路归并就可以了

c语言如何用数组对字符串排序,怎么用qsort对二维字符数组存的若干字符串排序...相关推荐

  1. C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果。

    /*C语言:用二维字符数组的每行存储键盘输入的字符串,将这些字符串按字典顺序升序排序,输出排序后的结果.*/#include <stdio.h> #include <conio.h& ...

  2. 输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。...

    输入5个学生的名字(英文),使用冒泡排序按从大到小排序. 提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个 字符串数组就是一个二维字符数组. #include <stdio.h> ...

  3. c语言学习-从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组)

    从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组) 程序流程图: 代码: #include<stdio.h> void main() {int b[10]; int a[5][ ...

  4. C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如:char a[] [10]={"asd","asa","werew","yuyu&quo ...

  5. C语言二维字符数组详解

    二维字符数组一般用于存储和处理多个字符串,二维字符数组中的每一行均可存储表示一个字符串. 二维字符数组的定义 二维字符数组的定义格式为: char 数组名[第一维大小][第二维大小]; 如: char ...

  6. 二维字符数组按长度排序_字符串长度 字符数组长度

    1.不带转义字符的字符 如:"abc!x=/",其长度为 7 2.带转义字符的字符串 (1) 字符串"abcn":其中的'n'为转义字符(换行符),计算字符串长 ...

  7. C语言字符串类型定义(二维字符数组模拟连续存储多个字符串)(以小凡点名为例)

    经过dev-Cpp检验 #define _CRT_SECURE_NO_WARNINGS /* 老师让小凡来完成点名,让小凡在早自习的时候就点好名.老师给了小凡名单,小凡只要照着名单点名就好了是不是很简 ...

  8. C语言二维字符数组的输入

    标题 C语言字符数组的输入输出 定义一个字符二维数组,输入行数n,与列数m #include <stdio.h> #include <math.h> int main() {i ...

  9. 判断二维字符数组是否存在回文字符串例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“}; 提示存在回文字符串,回文字符串对称

    1.循环二维数组,存在回文,返回1,否则返回0 int LoopStr(char str[] [10],int n) 2.回文字符串函数,是回文返回1,否则返回0 int HuiWen(char *p ...

  10. (C++)输入输出字符矩阵(二维字符数组)的三种方法

    想输出一个这样的字符矩阵 CSU ZJU PKU scanf和printf #include<cstdio> #include<cmath>int main(){char sc ...

最新文章

  1. Linux动态库和静态库比较
  2. Ubuntu 12.10 拨号上网及停用方法
  3. Third-generation sequencing and the future of genomics 第三代测序和基因组学的未来
  4. python程序员月薪多少-据说做Python程序员,都月薪上万?
  5. MySQL高级 - 存储引擎 - 选择原则
  6. JavaSE——流程控制(接收输入Scanner、分支结构(if与switch)、循环结构(while、do-while与for))
  7. CV Code | 本周新出计算机视觉开源代码汇总(含目标跟踪、语义分割、姿态跟踪、少样本学习等)...
  8. 丽江,是否一群失意的人聚合地
  9. 程序设计c语言答案pdf,C语言程序设计习题解答.pdf
  10. Ureport2源码启动
  11. Codeforces1102F Elongated Matrix 【状压DP】
  12. Android N Idle模式分析
  13. Win10如何修改用户名?
  14. EntityFramework 用Moles的mock
  15. Js函数加括号、不加括号
  16. Android中全局搜索(QuickSearchBox)详解(一)
  17. 如何快速一次性通过pmp考试?
  18. 如何提高CSDN博客排名
  19. Mysql导出表结构到excel
  20. Process 'command 'XXX/Android/Sdk/build-tools/25.0.3/aapt'' finished with non-zero exit value 1

热门文章

  1. 3.剑指Offer --- 高质量的代码
  2. 17.卷1(套接字联网API)--- ioctl 操作
  3. 50. 避免重定向(11)
  4. 10. Document getElementsByTagName() 方法
  5. 【编程工具】Sublime Text3快捷键配置
  6. vCenter 6.0 vsca 安装遇到的一些小问题
  7. 0-1之间的随机数 C/C++
  8. SQL Server 字符串拆分
  9. C#.NET分别以GET和POST方式抓取远程页面
  10. gem install XXX报错