Witam juz od dlugiego czasu borykam sie z takim oto zadaniem:
Napisz program, który przekształci zadany plik tekstowy w drugi plik tekstowy wg
podanych poniżej zasad.
Program ten powinien być uruchamiany z trzema parametrami: nazwą analizowanego
pliku, nazwą pliku, w którym należy zapisać wynik oraz dodatkowym słowem
slowo_specjalne. Wywołanie programu:
./program plik.in plik.out slowo_specjalne
Jeśli plik wejściowy nie istnieje lub nie otworzył się poprawnie, należy zgłosić błąd.
Zasady tworzenia pliku wyjściowego:
• Wszystkie litery duże należy zamienić na małe, chyba, że należą do wczytanego
słowa specjalnego (wtedy nie należy ich modyfikować); samo słowo specjalne składa
się co najwyżej z 8 znaków alfanumerycznych (tzn. liter lub cyfr).
• Wszystkie cyfry należy zmniejszyć o ’1’ (cyfrę ’0’ należy zamienić się na ’9’), chyba,
że należą do wczytanego słowa specjalnego (wtedy nie należy ich modyfikować).
• Należy opuścić tekst znajdujący się wewnątrz komentarza, tzn. wewnątrz znaków /*
... */. Komentarze mogą być zagłębione. Można założyć, że są one w tekście użyte
poprawnie.
Dodatkowo program powinien zliczyć liczbę wystąpień słowa specjalnego. Liczbę tę
należy wypisać na standardowe wyjście.
Mój kod wygląda następująco:
#include<stdio.h>
#include<stdlib.h>
int main (int argc, char *argv[])
{
int i,j,k,d,s; // k=ilosc komentarzy, d= dlugosc slowa klucznowego, s=ilosc wystapien slowa kluczoweg
while (argv[3][d++]!='\0')
{
FILE p1=fopen (argv[1], "r");
FILE p2=fopen (argv[2], "w+");
if (p1==NULL)
{
printf("nie ma takiego pliku");
return -1;
}
char szukaj[512];
while (fgets(szukaj,512,p1)!='\0') // Tworze pętle która zaczyna szukać mi komentarzy
{ // jesli znajdzie to nie zapisuje ich do pliku 2
for(i=0;szukaj[i]!='\0'; i++)
{
if(szukaj[i]=='/' && szukaj[i+1]=='')
{
k++;
i++;
continue;
}
if (k>0)
{
if(szukaj[i]=='' && szukaj[i+1]=='/')
k--;
i++;
}
}
else
{
if ((strncmp(szukaj + i, argv[3], d-1) == 0) && //szukam slowa kluczowego w danym pliku wejsciowym
!((szukaj[i +d-1] > 47 &&
szukaj[i+d-1] < 58) ||
(szukaj[i+d-1] > 64 &&
szukaj[i+d-1] < 91) ||
(szukaj[i+d-1] > 96 &&
szukaj[i+d-1] < 123))&& !
((szukaj[i -1] > 47 &&
szukaj[i -1] < 58) ||
(szukaj[i -1] > 64 &&
szukaj[i -1] < 91) ||
(szukaj[i -1] > 96 &&
szukaj[i -1] < 123)))
{
s++;
fputs(argv[3],p2);
i+=d-1;
}
else if (szukaj[i]>64 && szukaj[i]<91) //jesli znajde jakas cyfre to zmniejszam jej wartosc o 1
szukaj[i]+=32;
else if (szukaj[i]>48 && szukaj[i]<58)
szukaj[i]-=1;
if (szukaj[i]=48) //cyfe 0 zamieniam na 9
szukaj [i]=57;
fprintf(p2,"%c",szukaj[i]);
}
}
}
printf ("%d\n",s); // wypisuje liczbe wystapien slowa specjalnego
fclose(p2);
fclose(p1);
return 0;
}
I cos w nie dziala a ja nie mam pojęcia co. szukałem, zmieniałem, czytałem i za nic nie moge poprawnie zrobic tego zadania. Czy ktos byłby na tyle miły i rzucił na to okiem?