|- - -|
|

Napisati program mygrep koji iz teksta sa ulaza (niz linija limitirane dužine) izdvaja sve linije koje sadrže nisku koja se zadaje kao argument komandne linije. Obezbediti da program ne pravi razliku među malim i velikim slovima ako je među argumentima komandne linije prisutan opcioni argument -i.
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 ispitaj(char b[], char c[], int ima);
int readlines(char *s[], int max, char a[], int ima);
int writelines(char *s[], int brlinija);
main(int argc, char *argv[])
{
int brojlinija, prvi=1, ima=0;
char a[MAXDUZ];
char s[]="-i";
if ((argc > 3) || (argc == 1))
{
printf("Greska!!! Lose ste uneli argumenate sa komandne linije.\nTrebalo je da unesete mygrep <rec> -i");
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 -i");
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, ima);
writelines(lineptr, brojlinija);
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 ispitaj(char b[], char c[], int ima)
{
int i, j, d, provera=0;
if (ima == 0)
{
if (strstr(b, c) != NULL)
return 1;
else return 0;
}
else
{
for (i=0; c[i]; i++)
if (islower(c[i]))
c[i] -= 32;
d = strlen(c);
for (i=0; b[i+d-1]; i++)
{
if (provera)
return 1;
provera = 1;
for (j=0; c[j]; j++)
if (provera)
{
if (!isalpha(c[j]))
{
if (b[i+j] != c[j])
provera = 0;
}
else if ((b[i+j] != c[j]) && (b[i+j] != (c[j]+32)))
provera = 0;
}
}
if (provera)
return 1;
return 0;
}
}
int readlines(char *s[], int max, char a[], int ima)
{
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 (ispitaj(line, a, ima))
{
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:\...>mygrep rec -i
racunarstvo
nAREcje
vezbe
rec
recNI
ReCitost
^Z
nAREcje
rec
recNI
ReCitost


|
|= - =|
|_ - _|