练习5-13 编写程序tail,将其输入中的最后n行打印出来。默认情况下,n的值为10,但可以通过一个可选参数改变n的值
来源:互联网 发布:宋宁宗 知乎 编辑:程序博客网 时间:2024/06/02 03:48
若行数小于n,则全部打印,若行数大于n则打印最后n行,使用条件if(nlines<=n || i>=nlines-n)判断第i行是否打印。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLINES 5000char *lineptr[MAXLINES];int readlines(char *lineptr[],int nlines);main(int argc,char *argv[]){ int i,n,nlines; if(argc>1 && (*argv[1]='-')) n=atoi(&(*++argv)[1]); else n=10; nlines=readlines(lineptr,MAXLINES); for(i=0;i<nlines;i++) if(nlines<=n || i>=nlines-n) printf("%s\n",lineptr[i]);}#define MAXLEN 1000int getline(char *,int);char *alloc(int);int readlines(char *lineptr[],int maxlines){ int len,nlines; char *p,line[MAXLEN]; nlines=0; while((len=getline(line,MAXLEN))>0){ if(nlines>MAXLINES || (p=alloc(len))==NULL) return -1; else{ line[len-1]='\0'; strcpy(p,line); lineptr[nlines++]=p; } } return nlines;}int getline(char *s,int lim){ int c; char *t=s; while(--lim>0 &&(c=getchar())!=EOF && c!='\n') *s++=c; if(c=='\n') *s++=c; *s='\0'; return s-t;}#define ALLOCSIZE 10000static char allocbuf[ALLOCSIZE];static char *allocp=allocbuf;char *alloc(int n){ if(allocbuf+ALLOCSIZE-allocp>=n){ allocp+=n; return allocp-n; } else return 0;}
答案中
bufend=buf+LINES*MAXLEN
指针超出数组1位(指针越界),会有怎样结果?测试:
#include <stdio.h>main(){ char a[3]; char *p; a[0]='a'; a[1]='b'; a[2]='\0'; printf("%s\n",a); p=a+1; printf("%s\n",p); p=a+2; printf("%s\n",p); p=a+3; printf("%s\n",p);}
运行输出:
若程序数组下标赋值起始位置不对:
#include <stdio.h>main(){ char a[3]; char *p; a[1]='a'; a[2]='b'; a[3]='\0'; printf("%s\n",a); p=a+1; printf("%s\n",p); p=a+2; printf("%s\n",p); p=a+3; printf("%s\n",p);}
运行输出:
指针指向随机位置。
答案程序:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define DEFLINES 10#define LINES 100#define MAXLEN 100void error(char *);int getline(char *,int);main(int argc,char *argv[]){ char *p; char *buf,*bufend; char line[MAXLEN]; char *lineptr[LINES]; int i,first,last,len,n,nlines; if(argc==1) n=DEFLINES; else if(argc==2 && (*++argv)[0]=='-') n=atoi(argv[0]+1); else error("usage: tail [-n]"); if(n<1||n>LINES) n=LINES; for(i=0;i<LINES;i++) lineptr[i]=NULL; if((p=buf=malloc(MAXLEN*LINES))==NULL) error("tail: cannot allocate buf"); bufend=buf+MAXLEN*LINES; last=0; nlines=0; while((len=getline(line,MAXLEN))>0){ if(p+len+1>=bufend) p=buf; strcpy(p,line); lineptr[last]=p; if(++last>=LINES) last=0; p+=len+1; nlines++; } if(n>nlines) n=nlines; first=last-n; if(first<0) first+=LINES;//first=LINES-1-(n-last)+1 for(i=first;n-->0;i=(i+1)%LINES) printf("%s",lineptr[i]);}void error(char *s){ printf("%s\n",s); exit(1);}int getline(char *s,int lim){ int c; char *t=s; while(--lim>0 && (c=getchar())!=EOF && c!='\n') *s++=c; if(c=='\n') *s++=c; *s='\0'; return s-t;}
0 0
- 练习5-13 编写程序tail,将其输入中的最后n行打印出来。默认情况下,n的值为10,但可以通过一个可选参数改变n的值
- 编写程序tail,将其输入中的最后n行打印出来。
- 题目:使用命令行参数编写一个程序,其功能是将任意一个正整数m变换为指定的n 进制数串输出。命令行的格式为:
- 3.8 编写一个程序打印如图 3.1 所示的 n 阶杨辉三角形,其中 n 由用户输入,该值不 能大于 13。
- 编写程序输入一个n*n的矩阵,求出两条对角线元素值之和
- [6,n]中的素数之和为偶数的打印出来
- 编写一个求n个数的平均值及最小值的程序。要求:程序执行时,用户先由键盘输入n的值,之后输入n个数,最后,程序显示平均值和最小值。
- 练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个空格之后
- 练习2-6 编写一个函数setbits(x,p,n,y),将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值
- 一个有趣的程序——可以打印自己第N行代码的程序
- 编写一个程序,输入n,求n!(用递归的方式实现)
- 编写一个程序,输入N,求N ! 用递归的方式
- 蓝桥杯题目 输入一个正整数n,输出n!的值。
- ACM题目:第一行输入n m,第二行输入一个数列,n为数列长度,m为要插入的值,排序后输出,m n为零时退出程序
- C语言 - ACM题目:第一行输入n m,第二行输入一个数列,n为数列长度,m为要插入的值,排序后输出,m n为零时退出程序
- 编写程序输入一个n*n的矩阵,求出两条对角线元素值之和(注意把输入的元素写入二维数组的方式)
- 贪心算法——输入任意一个正整数N,将其分成多个互不相同的整数,和为N,乘积最大
- 输出n! n为用户输入的一个正整数 n! = n*(n-1)*(n-2)*...*1 5! = 5*4*3*2*1 = 120
- Linux文件权限一共10位长度,分成四段,第三段表示的内容是()。
- JDK源码学习之String篇
- HTTP 请求未经客户端身份验证方案“Anonymous”授权。从服务器收到的身份验证标头为“Basic realm=xxxxx”
- ps灵魂区域:图像模式
- [Java开发之路](26)Cookie机制
- 练习5-13 编写程序tail,将其输入中的最后n行打印出来。默认情况下,n的值为10,但可以通过一个可选参数改变n的值
- 数组元素的全排列
- Unity触摸控制旋转缩放
- C++之友元
- url带参数链接,以及跳转页面接受参数
- JAVA学习第二弹
- 面向对象面试题
- POJ 3243 Clever Y
- 集合面试题