|- - -|
|

Napisati program mygrep2 koji iz teksta sa ulaza (niz linija limitirane dužine) izdvaja samo one linije koje ne sadrže nisku koja se zadaje kao argument komandne linije. Ako je među argumentima komandne linije prisutan opcioni argument -n, onda obezbediti da program ispred svake linije na izlazu ispiše i njen redni broj u tekstu sa ulaza.
rešenje (.c)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX 5000
#define MAXDUZ 1000
char *lineptr[MAX];
int getline(char k[], int lim);
int readlines(char *s[], int max, char a[], int b[]);
int writelines(char *s[], int brlinija, int b[], int ima);
main(int argc, char *argv[])
{
int brojlinija, prvi=1, ima=0, brojac[MAXDUZ];
char a[MAXDUZ];
char s[]="-n";
if ((argc > 3) || (argc == 1))
{
printf("Greska!!! Lose ste uneli argumenate sa komandne linije.\nTrebalo je da unesete mygrep2 <rec> -n");
return 0;
}
else if (argc == 3)
{
if ((prvi = strcmp(argv[1],s) != 0) && (strcmp(argv[2],s) != 0))
{
printf("Greska!!! Medju argumentima komandne linije mora se naci -n");
return 0;
}
else
{
ima = 1;
if (prvi == 0)
strcpy(a, argv[2]);
else
strcpy(a, argv[1]);
}
}
if (argc == 2)
strcpy(a, argv[1]);
brojlinija = readlines(lineptr, MAX, a, brojac);
writelines(lineptr, brojlinija, brojac, ima);
return 0;
}
int getline(char k[], int lim)
{
int i;
char c;
for(i=0; ((i<lim-1) && ((c = getchar()) != EOF) && (c != '\n')); i++)
k[i] = c;
if (c == '\n')
k[i++] = c;
k[i] = '\0';
return i;
}
int readlines(char *s[], int max, char a[], int b[])
{
int i=0, len, brojlinija=0, br=0;
char *p;
char line[MAXDUZ];
while (brojlinija < max-1)
{
br++;
if (((len = getline(line, MAXDUZ)) == 0))
return brojlinija;
else
{
if (strstr(line, a) == NULL)
{
if ((p = (char*) malloc(len+1)) == NULL)
return brojlinija;
strcpy(p, line);
b[i] = br;
s[i++] = p;
brojlinija++;
}
}
}
return brojlinija;
}
int writelines(char *s[], int brlinija, int b[], int ima)
{
int i, j, t=1, r, x;
x = b[brlinija-1];
while (x/10)
{
x /= 10;
t++;
}
for (i=0; i < brlinija; i++)
{
if (ima)
{
r = 1;
x = b[i];
while (x/10)
{
x /= 10;
r++;
}
printf("%d", b[i]);
for (j=0; j < (t-r+1); j++)
printf(" ");
}
printf("%s", s[i]);
}
}

Primer:

C:\...>mygrep2 niz -n
sniziti
racunarstvo
niz
nanizati
NANIZATI
OnizAK
informatiKA
nizIna
456
ponizno
Nizvodno
matematika
^Z
2  racunarstvo
5  NANIZATI
7  informatiKA
9  456
11 Nizvodno
12 matematika


|
|= - =|
|_ - _|