对文本行进行排序,新增-d(目录排序),只对字母数字空格排序(TCPL 练习5-16)
文本行的排序用到了命令行参数以及多级指针,在要求只对字母数字空格进行排序时,关键的问题点是兼容-f命令参数,也就是排序的同时忽略大小写。
由于在之前的练习中,我将忽略大小写的比较方法重新写了一个函数transfercmp(),于是无法再sort排序程序中同时调用他们。
因此,不得不增加一个外部变量uptolow,用来在只对字母数字排序的函数inpuntcmp()中兼容忽略大小写的排序方式。
暂时还没有想到更好的方法。
#include <stdio.h>
#include <string.h>
/* 编写sort函数,扩充其功能,使得函数只对空格数字和字母排序,-d为指令,还需能和-r,-f等组合使用 */
#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并列的选项 */
static char allocbuf[];
static char *allocp=allocbuf;
int post=,uptolow=; /* post 为1则逆序排序;uptolow为1,忽略大小写 */ main(int argc, char *argv[])
{
int nlines,nlines2; /* 读入的输入行数 */
int numeric=,nw=; /* numeric为1则以数值排序 uptolow为1则转换大小写 */ while(argc-->){
if(strcmp(*++argv,"-n")==)
numeric=;
else if(strcmp(*argv,"-r")==)
post=;
else if(strcmp(*argv,"-f")==)
uptolow=;
else if(strcmp(*argv,"-d")==)
nw=; /* nw为1只对字母数字空格排序 */
else
printf("error: unkonwn command\n");
}
if((nlines=readlines(lineptr,MAXLINES))>=) {
if(nw==){
sort((void **)lineptr, post?(nlines-):, post?:(nlines-), (int (*)(void*,void*))(inpuntcmp));
writelines(lineptr,nlines);
return ;
} else {
if(uptolow==)
sort((void **)lineptr, post?(nlines-):, post?:(nlines-), (int (*)(void*,void*))(numeric?numcmp:strcmp));
else
sort((void **)lineptr, post?(nlines-):, post?:(nlines-), (int (*)(void*,void*))(numeric?numcmp:transfercmp)); writelines(lineptr,nlines);
return ;
}
}
else {
printf("input too big to sort\n");
return ;
} } void sort(void *v[], int left, int right, int (*comp)(void *, void *))
{
if(post==) {
int i, last;
void swap(void *v[], int, int); if(left>=right)
return;
swap(v,left,(left+right)/);
last =left;
for(i=left+;i<=right;i++)
if((*comp)(v[i],v[left])<)
swap(v,++last,i);
swap(v,left,last);
sort(v,left,last-,comp);
sort(v,last+,right,comp);
} else
{
int i, last;
void swap(void *v[], int, int); if(left<=right)
return;
swap(v,left,(left+right)/);
last =left;
for(i=left-;i>=right;i--)
if((*comp)(v[i],v[left])<)
swap(v,--last,i);
swap(v,left,last);
sort(v,left,last+,comp);
sort(v,last-,right,comp);
}
}
#include<stdlib.h>
int numcmp(char *s1,char *s2)
{
double v1,v2;
v1=atof(s1);
v2=atof(s2);
if(v1<v2)
return -;
else if (v1>v2)
return ;
else
return ; } void swap(void *v[], int i, int j) {
void *temp; temp =v[i];
v[i]=v[j];
v[j]=temp; }
#define MAXLEN 1000
int getline(char *, int);
int readlines(char *lineptr[], int maxlines) {
int len,nlines;
char *p,line[MAXLEN];
nlines =;
while((len=getline(line,MAXLEN))>)
if (nlines>= maxlines || (p=alloc(len))==)
return -;
else {
line[len-]=;
strcpy(p,line);
lineptr[nlines++]=p;
}
return nlines;
} void writelines(char *lineptr[], int nlines)
{
int i; for(i=; i< nlines; i++)
printf("%s\n",lineptr[i]);
}
int getline(char *s, int lim) {
int i=,c;
for(; i<lim && (c=getchar()) != EOF && c!='\n';++i)
*(s+i)=c;
if(c=='\n') {
*(s+i)=c;
++i;}
*(s+i)=;
return i; }
char *alloc(int n) {
if(allocbuf +-allocp>=n) {
allocp +=n;
return allocp - n;
} else
return ;
}
#include<ctype.h>
int inpuntcmp(char *s1, char *s2)
{
char c,d;
while(*s1 != && *s2!=) {
while(ispunct(*s1)) {
if(*s1==)
return -;
++s1;
}
while(ispunct(*s2)) {
if(*s2==)
return ;
++s2;
}
if(uptolow==) {
c=tolower(*s1);
d=tolower(*s2);
}
else {
c=*s1;
d=*s2;
}
if(c<d)
return -;
else if (c>d)
return ;
++s1;
++s2; }
if(*s1<*s2)
return -;
else if (*s1>*s2)
return ;
else
return ;
}
int transfercmp(char *s1, char *s2)
{
char c,d;
while(*s1 != && *s2!=) {
c=tolower(*s1);
d=tolower(*s2);
if(c<d)
return -;
else if (c>d)
return ;
++s1;
++s2; }
if(*s1<*s2)
return -;
else if (*s1>*s2)
return ;
else
return ;
}
对文本行进行排序,新增-d(目录排序),只对字母数字空格排序(TCPL 练习5-16)的更多相关文章
- 含有对象的List集合实现字母数字混合排序
List<PageData> varList = [{BOMCode=10A, mantotal=4}, {BOMCode=10B, mantotal=1}, {BOMCode=11A, ...
- 对文本行按特定字段排序(前N个字符或后N个字符),TCPL 练习5-17
The C programming language 的关于文本行排序的问题有很多种要求的方式,在对每行的字段排序方面,最简单的是例如对前N个字符或者末位N个字符进行排序,更高一点的要求是,对特殊符号 ...
- UltraEdit文本行数多变一和一边多
一.UltraEdit文本行数多行转换成一行 1.文本样式内容 1.qwertyuuiopqwertyuuiopqwertyuuiopqwertyuuiopqwertyuuiopqwertyuuiop ...
- Linux文本行倒序排列6种方法
Linux文本行倒序排列6种方法 1. 命令方法: nl filename | sort -nr | cut -f2 这个方法很unix风格,使用多命令组合完成某种功能是典型的unix特点 单命令: ...
- 读取txt文件将文本行组合成特定格式
有一网友要求从txt文本文件读取一些数据,然后组合为特定格式的数据行.原论题如下,刚才开始的要求描述得不太清楚,后来补充完整了. Insus.NET觉得本论题可有练习文本件读取功力,因此尝试实现一下. ...
- [Python学习笔记-008] 使用双向链表去掉重复的文本行
用Python处理文本文件是极方便的,当文本文件中有较多的重复的行的时候,将那些重复的行数去掉并打印诸如"...<repeats X times>..."有助于更好的浏 ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- 剑指Offer面试题:32.数字在排序数组中出现的次数
一.题目:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 二.解题思路 2 ...
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
随机推荐
- 提高SQL查询效率(SQL优化)
要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到 ...
- DNS弹窗广告遭遇
事情是这样的,不久前,我跟往常一样打开某新闻网页的时候,发现右下角有弹窗广告,并且在原页面任意位置点击,都会打开一个广告页面,然后原页面才能正常点击,手法太低劣了,不像是网站挂的广告,然后打开其它网页 ...
- Daily Scrum 12.13
今日完成任务: 已经解决用户管理异常:解决主页TAG显示不正确;解决下载量不正确,完成下载量的计数. 明日任务: 黎柱金 解决文档打开时全部是同一个PDF的BUG 冯飘飘 优化右侧显示最佳资源的算法 ...
- 关于fast cgi和php-fpm的关系
相关文档“https://segmentfault.com/q/1010000000256516%20” 一.什么是cgi cgi是一个协议,这个协议规定我们web服务器访问的时候,nginx和php ...
- C# 中科学计数法转成正常值
抓取数据的时候碰到科学技术法,查了一些资料,直接贴代码 /// <summary> /// 数字科学计数法处理 /// </summary> /// <param nam ...
- exe文件放在其他位置
set PATH=%PATH%;%UGII_ROOT_DIR%call "E:\ZY\exe\uds_rename_parts_mohao.exe"E:\ZY\exe\uds_re ...
- Android 图片添加水印图片或者文字
给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- silverLight--绑定数据dataGrid
后台代码编写 ,为表格绑定数据: using System; using System.Collections.Generic; using System.Linq; using System.Net ...
- 结构化查询语言(SQL)数据类型
简要描述一下结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型. 字符型 VARCHARVS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用 ...
- using 语句中使用的类型必须可隐式转换为“System.IDisposable
在使用 EF 出现 using 语句中使用的类型必须可隐式转换为“System.IDisposable 今天写在这里分享给大家 出现这样的问题,是因为没有引用 EntityFramework 这个程 ...