|- - -|
|

Napisati program mytail koji ispisuje poslednjih n linija teksta sa ulaza (niz linija limitirane dužine). Podrazumevana vrednost za n je 10, ali tu vrednost može da izmeni opcioni argument, tako da
mytail -n
štampa poslednjih n linija. Voditi računa o efikasnosti pri korišćenju raspoložive memorije.
rešenje (.c)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 5000
#define MAXDUZ 1000
char *lineptr[MAX];
int getline(char a[], int lim);
int readlines(char *s[], int max, int n);
int writelines(char *s[], int brlinija);
main(int argc, char *argv[])
{
int brojlinija, n=0, i;
char znak;
if (argc > 2)
{
printf("Greska!!! Lose ste uneli argumente komandne linije.\nTrebalo je da unesete: myhead -n (gde je n prirodan broj)");
return 0;
}
if (argc == 2)
{
if (argv[1][0] == '-')
{
for (i=1; (((znak = argv[1][i]) >= '0') && (znak <= '9')); i++)
n = n*10+(znak-'0');
if (znak != '\0')
{
printf("Greska!!! Lose ste uneli broj");
return 0;
}
if (n == 0)
{
printf("Greska!!! Treba da unesete povlaku i prirodan broj");
return 0;
}
}
else
{
printf("Greska!!! Treba da unesete povlaku i prirodan broj");
return 0;
}
}
if (argc == 1)
n=10;
brojlinija = readlines(lineptr, MAX, n);
writelines(lineptr, brojlinija);
return 0;
}
int getline(char a[], int lim)
{
int i;
char c;
for(i=0; ((i<lim-1) && ((c = getchar()) != EOF) && (c != '\n')); i++)
a[i] = c;
if (c == '\n')
a[i++] = c;
a[i] = '\0';
return i;
}
int readlines(char *s[], int max, int n)
{
int i=0, m, len, brojlinija=0;
char *p, *t;
char line[MAXDUZ];
m = n;
while (brojlinija < max-1)
if (((len = getline(line, MAXDUZ)) == 0))
return brojlinija;
else
{
if (m-- > 0)
{
if ((p = (char *) malloc(len+1)) == NULL)
return brojlinija;
strcpy(p, line);
s[i++] = p;
brojlinija++;
}
else
{
if ((p = (char *) malloc(len+1)) == NULL)
return brojlinija;
strcpy(p, line);
t = s[0];
for (i=0; i < n-1; i++)
s[i] = s[i+1];
s[n-1] = p;
p = t;
free(p);
}
}
return brojlinija;
}
int writelines(char *s[], int brlinija)
{
int i;
for (i=0; i<brlinija; i++)
printf("%s", s[i]);
}

Primer:

C:\...>mytail -5
Ovako
pozvan
program
ce
ispisati
zadnjih
5
redova
^Z
ce
ispisati
zadnjih
5
redova


|
|= - =|
|_ - _|