对文本行按特定字段排序(前N个字符或后N个字符),TCPL 练习5-17

The C programming language 的关于文本行排序的问题有很多种要求的方式,在对每行的字段排序方面,最简单的是例如对前N个字符或者末位N个字符进行排序,更高一点的要求是,对特殊符号标识的字段排序,例如,对逗号前的字段进行排序能,标识符号要尽可能地自定义,这里的程序实现了前者,即依据命令行参数N,对每行的前N或者后N个字符排序,当然,也实现了和-f(忽略大小写),-d(只对空格数
摘要由CSDN通过智能技术生成

The C programming language 的关于文本行排序的问题有很多种要求的方式,在对每行的字段排序方面,最简单的是例如对前N个字符或者末位N个字符进行排序,更高一点的要求是,对特殊符号标识的字段排序,例如,对逗号前的字段进行排序等,标识符号要尽可能地自定义,这里的程序实现了前者,即依据命令行参数N,对每行的前N或者后N个字符排序,当然,也实现了和-f(忽略大小写),-d(只对空格数字字母排序),-r(逆序)的组合使用,因此,基本完成了如书上所说,可以进行索引排序。但是哪怕是这一个简单的实现,也需要进一步考虑的问题是:能否对文本行中间N个字符进行排序?某些特殊场合可能会提出这样的要求。

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
/*  编写文本行排序函数,扩充其功能,使得函数能对特定字段排序,本例实现了对前leng个字符和末位leng个字符的排序,+为指令,还需能和-r,-f,-d等组合使用 */
#define MAXLINES 5000		/*  待排序的最大行数 */
char *lineptr[MAXLINES];	/*	指向问本行的指针 */

int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
int inpuntcmp(char *, char *);          /*  函数inpuntcmp:将忽略除空格字母数字以外的字符比较,如果某行以上三种字符都没有,则判断为最小 */

char *alloc(int n);
void sort(void *lineptr[], int left, int right, int (*comp)(void *, void *));
int numcmp(char *, char *);
int transfercmp(char *s1, char *s2);   /* 函数transfercmp:忽略大小写的按字典比较的函数,例如,认为a=A,和numcmp以及strcmp并列的选项 */
int newstrcmp(char *s1, char *s2); /*  重新编函数newstrcmp: 实现对特定字段的一般字符比较,替代原来的strcmp  */ 
static char allocbuf[10000];
static char *allocp=allocbuf;
int post=0,uptolow=0,leng=0;				/*	post 为1则逆序排序;uptolow为1,忽略大小写,leng为字段分隔数,如为正,则对前leng个字符排序,为负,对末位leng个字符排序  */

main(int argc, char *argv[])
{
	int nlines;				/*  读入的输入行数			*/
	int numeric=0,nw=0;			/*  numeric为1则以数值排序 uptolow为1则转换大小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值