点击这里给我发消息 点击这里给我发消息

C程序设计语言习题 tail -n

添加时间:2013-12-7
    相关阅读: 设计 程序
副标题#e#

    C程序设计语言里有一道习题是,tail -n

    根据n的值打印,输入行的最后几行。默认打印10行,

    我写了一个,代码如下,供大家交流讨论

    #include
    #include
    #define MAXLINES 1000
    char *lineptr[MAXLINES];
    int readlines(char *lineptr[],int lines);
    void writelines(char *lineptr[],int lines);

    int main(int argc,char *argv[])
    {
    int lines;
    char str;
    int digit=0;

    if( argc >1 )
    { if((*++argv)[0] == '-' )
    {
    while((str=*++argv[0])!='')
    if(str>='0' && str <='9')
    digit=digit*10+(str-'0');
    else
    {digit=10; break;}
    }
    else digit=10;
    }
    else digit=10;

    if( (lines=readlines(lineptr,MAXLINES) ) >= 0 )
    {
    if(digit==10)
    {
    if( lines < digit)
    writelines(lineptr,0);
    else
    writelines(lineptr,lines-digit);
    }
    else if(lines
    writelines(lineptr,0);
    else
    writelines(lineptr,lines-digit);
    }
    return 0;
    }

    #define MAXLEN 1000
    int getline(char *,int);
    char *alloc(int);

    int readlines(char *lineptr[],int maxline)
    {
    int nlines=0;
    int len;
    char *p,line[MAXLEN];

    while( (len=getline(line,MAXLEN)) >0 )
    {
    if(len>MAXLEN || (p=alloc(len))==NULL)
    return -1;
    else{
    line[len-1]='';
    strcpy(p,line);
    [nlines++]=p;
    }
    }
    return nlines;
    }
    /*void writelines(char *lineptr[],int begin )
    {//writelines的另一种实现方式
    char **ptr;
    for(ptr=lineptr+begin;ptr<=lineptr+lines-1;++ptr)
    printf("%s\n",*ptr);
    }*/
    void writelines(char *lineptr[],int begin )
    {
    lineptr+=begin;

    while(*lineptr!=NULL)
    printf("%s\n",*lineptr++);
    }
    int getline(char line[],int maxline)
    {

    int c;
    int i=0;

    while( --maxline > 0 && (c=getchar())!=EOF && c!='\n')
    line[i++]=c;
    if(c=='\n')
    line[i++]='\n';
    line[i]='';
    return i;
    }

    #define ALLOCSIZE 10000
    static char allocbuf[ALLOCSIZE];
    static char *allocp=allocbuf;

    char *alloc(int n)
    {
    if(allocbuf+ALLOCSIZE-allocp>=n)
    {
    allocp+=n;
    return allocp-n;
    }
    return NULL;
    }

    listli的代码:支持文件名,比较通用的说

    #include
    #include

    #define LINE 1000
    #define SIZE 512

    struct lines {
    int chs;
    }info[LINE];
    static int total; /*total lines*/
    static FILE *fp;
    static int n; /*the last n lines to be read*/

 

#p#副标题#e#

   void
    printUsage()
    {
    fprintf(stderr, "Usage: tail [-n] [filename]\n");
    exit(1);
    }

    int
    cmdParse(int argc, char **argv)
    {
    if (argc == 1) {
    fp = stdin;
    n = 10;
    } else if(argc == 2) {
    if (argv[1][0] == '-') {
    n = atoi(&argv[1][1]);
    fp = stdin;
    } else {
    n = 10;
    fp = fopen(argv[1],"r");
    }
    } else if(argc == 3) {
    n = atoi(&argv[1][1]);
    fp = fopen(argv[2],"r");
    } else {
    printUsage();
    }
    return n;
    }

    void tail(int);
    int
    main(int argc,char **argv)
    {

    cmdParse(argc,argv);
    char tembuf[SIZE];
    int i ;
    for( i = 0; fgets(tembuf,sizeof tembuf,fp); ++i) {
    info[i].chs = strlen(tembuf);
    total++;
    }
    tail(n);
    while(fgets(tembuf,sizeof tembuf,fp))
    fputs(tembuf,stdout);
    return 0;
    }

    void
    tail(int n)
    {
    int tolen = 0;
    int i;
    for(i = total - n ; i < total ;++i)
    tolen += info[i].chs;
    fseek(fp,-tolen,SEEK_CUR);
    }

相关C程序设计语言习题&nbsp;tail&nbsp;-n

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册