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