鱼C论坛

 找回密码
 立即注册
查看: 2246|回复: 1

大神们看过来

[复制链接]
发表于 2017-12-13 11:08:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
将其输入中的最后n行打印出来。有几句我看不懂是什么意思(我用其他颜色标注了)
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEFLINES 10     //自定义的行数,即用户没有自定义时系统默认输出的行数
#define LINES 100        //最大输出行数
#define MAXLEN 100       //最大输出一行中的长度

int getline(char line[], int maxlen);

int main(int argc, char *argv[])
{
    char *p;
    char *buf;
    char *bufend;
    char line[MAXLEN];
    char *lineptr[LINES];
    int first, i, last, len, n, nlines;

    if(argc == 1)
    {
        n = DEFLINES;    //若等于1时即用户没有自定义行数,执行默认行数
    }
    else if(argc == 2 && (*++argv)[0] == '-')   //判断用户自定义的函数
    {
        n = atoi(argv[0] + 1);
    }
    else
    {
        printf("使用格式:tail [-n]\n");     //否则输出提示信息,并退出
        exit(1);
    }
    if(n < 1 || n > LINES)
    {
        n = LINES;            //自定义的函数不满足设定的值。
    }
    for(i = 0; i < 20; i++)
    {
        lineptr = NULL;
    }
    if((p = buf = malloc(LINES* MAXLEN)) == NULL)   //分配内存来存储字符串
    {
        printf("内存分配失败!\n");
        exit(1);
    }
    bufend = buf + LINES * MAXLEN;

    last = 0;
    nlines = 0;
    while((len = getline(line, MAXLEN)) > 0)
    {
        if(p + len + 1 >= bufend)
        {
            p = buf;
        }

        lineptr[last] = p;     //lineptr是一个指针数组每一个数组中的元素都是做一个指针,用来做存储输入字符串
        strcpy(lineptr[last], line);
        if(++last >= LINES)
        {
            last = 0;
        }
        p += len + 1;
        nlines++;
    }
    if(n > nlines)
    {
        n = nlines;
    }
    first = last - n;
    if(first < 0)
    {
        first += LINES;
    }
    for(i = first; n-- > 0; i = (i + 1) % LINES)    //若first为负数,余数从0开始
    {
        printf("%s", lineptr);
    }

    return 0;
}

int getline(char s[], int maxlen)
{
    int c, i = 0;
    while(--maxlen > 0 && (c = getchar()) != EOF && c != '\n')
    {
        s[i++] = c;
    }
    if(c == '\n')
    {
        s[i++] = c;
    }
    s = '\0';

    return i;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-13 11:25:24 | 显示全部楼层
  1. bufend = buf + LINES * MAXLEN;//设置bufend指针指向申请的内存空间的尾部
  2. if(p + len + 1 >= bufend)//当p已经指向了最后一行的后面一行,这个时候表示所有数据已经读完了,将p重新指向数据的开头buf
  3. {
  4.      p = buf;
  5. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表