|- - -|
|

Napisati program myhead koji ispisuje prvih 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
myhead -n
štampa prvih 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!!! Pogresno 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, len, brojlinija=0;
char *p;
char line[MAXDUZ];
while (brojlinija < max-1)
if (((len = getline(line, MAXDUZ)) == 0))
return brojlinija;
else
{ if (n-- > 0)
{
if ((p = (char *) malloc(len+1)) == NULL)
return brojlinija;
strcpy(p, line);
s[i++] = p;
brojlinija++;
}
}
return brojlinija;
}
int writelines(char *s[], int brlinija)
{
int i;
for (i=0; i<brlinija; i++)
printf("%s", s[i]);
}

Primer:

C:\...>myhead -5
Samo
prvih
5
redova
ce
biti
prepisano
^Z
Samo
prvih
5
redova
ce


|
|= - =|
|_ - _|