|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
|
|