neil123 发表于 2017-12-13 11:08:54

大神们看过来

将其输入中的最后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;
    char *lineptr;
    int first, i, last, len, n, nlines;

    if(argc == 1)
    {
      n = DEFLINES;    //若等于1时即用户没有自定义行数,执行默认行数
    }
    else if(argc == 2 && (*++argv) == '-')   //判断用户自定义的函数
    {
      n = atoi(argv + 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 = p;   //lineptr是一个指针数组每一个数组中的元素都是做一个指针,用来做存储输入字符串
      strcpy(lineptr, 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 = c;
    }
    if(c == '\n')
    {
      s = c;
    }
    s = '\0';

    return i;
}

BngThea 发表于 2017-12-13 11:25:24

bufend = buf + LINES * MAXLEN;//设置bufend指针指向申请的内存空间的尾部
if(p + len + 1 >= bufend)//当p已经指向了最后一行的后面一行,这个时候表示所有数据已经读完了,将p重新指向数据的开头buf
{
   p = buf;
}
页: [1]
查看完整版本: 大神们看过来