Gdzie jest błąd w kodzie? [C]

0

Miałem napisać program, który wyszuka zadany ciąg znaków w pliku tekstowym.
Jeśli ktoś wie jak napisać taki program, to bardzo proszę o pomoc, bo to mój pierwszy projekt i nie chciałbym go zawalić...

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFSIZE 1024
char buf[BUFFSIZE];

void szukaj(char *fraza, int buflen);
int main (int argc, char *argv[])
{
    int inf, bajty;
    if (argc != 3)
       {
             printf("Skladnia: program plik tekst\n");
             exit(1);
             }
   if ((inf=open(argv[1], O_RDOLNY))<0)
    {
                           printf("Nie moge otworzyc pliku %s.\n",argv[1]);
                           exit(1); 
} 

while((bajty=read(inf,buf,BUFFSIZE))>0)
                                       szukaj(argv[2],bajty);
close(inf);
return(0);
}
void szukaj(char *fraza, int buflen)
{
     char *ptr, *p;
     ptr=buf;
     while((ptr=*memchr(void *ptr,fraza[0],buflen))!=NULL)   //podobno gdzieś tutaj jest błąd, ale nie wiem jaki
     if(memcmp(ptr,fraza,strlen(fraza))==0)
     {
        printf("Pierwsze wystapienie tekstu:\n");
        for(p=ptr-20;p<ptr+20;p++)
        putchar(*p);
        return;
        }
     else ptr++;
     printf("Nie znaleziono tekstu: %s.\n", fraza);
}
                                      
 
0

A tak może pytanie zadasz ?
Co jest nie tak napiszesz ?

Na cpp się nie znam za dobrze, ale:

while((ptr=*memchr(void *ptr,fraza[0],buflen))!=NULL)

Czy pętli while nie trzeba przypadkiem otworzyć (klamry)?

0

W jednej linijce zaznaczyłem, że tam jest błąd. No i w drugim "if" jest błąd. Nie wiem o co chodzi

0

Otworzyłem klamrę, ale dostaję komunikat o błędzie "expected primary expression before "void"

0

void w tamtej linijce wygląda na niepotrzebny - wywal.
PS. W tym drugim if-ie walnąłeś literówkę - masz O_RDOLNY, powinno być O_RDONLY (open readonly)

0

Wtedy dostaję komunikat o trzech błędach w tej linijce:
invalid conversion from 'char' to 'const void*'
initializing argument 1of 'void* memchr(const void*, int, size_t)'
'void*' is not a pointer-to-object-type

Nie macie jakiegoś pomysłu jak napisać taki program?

0

W tym momencie wygląda to tak.

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFSIZE 1024
char buf[BUFFSIZE];

void szukaj(char *fraza, int buflen);
int main (int argc, char *argv[])
{
    int inf, bajty;
    if (argc != 3)
       {
             printf("Skladnia: program plik tekst\n");
             exit(1);
             }
   if ((inf=open(argv[1], O_RDONLY))<0)
    {
                           printf("Nie moge otworzyc pliku %s.\n",argv[1]);
                           exit(1); 
} 

while((bajty=read(inf,buf,BUFFSIZE))>0)
                                       szukaj(argv[2],bajty);
close(inf);
return(0);
}
void szukaj(char *fraza, int buflen)
{
     char *ptr, *p;
     ptr=buf;
     while((ptr=memchr(ptr,fraza[0],buflen))!=NULL){  //NADAL TUTAJ JEST GDZIEŚ BŁĄD
     if(memcmp(ptr,fraza,strlen(fraza))==0)
     {
        printf("Pierwsze wystapienie tekstu:\n");
        for(p=ptr-20;p<ptr+20;p++)
        putchar(*p);
        return;
        }
     else ptr++;
     printf("Nie znaleziono tekstu: %s.\n", fraza);
     }
}
  
 
0

Ptr jest typu char* (co może być stosowane jako tablica znaków). Jednak, gdy ty piszesz *Ptr, następuje dereferencja i uzyskujesz typ char (jeden znak), czego nie chcesz. Wobec tego nie może być *Ptr, tylko Ptr:

while((ptr=*memchr(ptr,fraza[0],buflen))!=NULL)

Dalej, memchr zwraca tobie wskaźnik void*, a ty potrzebujesz char*. Musisz mieć:

while((ptr=(char*)memchr(ptr,fraza[0],buflen))!=NULL)
0

No dobra, skompilowało (dzięki wielkie). Tylko jak teraz mu 'podłożyć' ten plik tekstowy i co zrobić żeby po wykonaniu od razu się nie zamknął?

0

Zakładam, że pracujesz na Linuksie (bo chyba tylko tam są takie rzeczy jak O_RDONLY czy inne).

Twój program dostaje przez argumenty dwie rzeczy: pierwsza - położenie pliku, druga - szukany tekst. Jeżeli uruchamiasz proga w terminalu poprzez:
./program
To po prostu robisz:
./program argument1 argument2

Aby program się nie zamykał po zakończeniu możesz zrobić:

getc(stdin);

Co będzie czekać na jeden znak z wejścia.

0

To zupełnie źle działa.

  1. W pliku txt jest zapisane:
    "tutaj nie ma
    moj projekt
    okkaaaaaaaaaaaaaaaaaaaaaaaaako

projekt oooo"
2. zadaje mu wyszukiwanie słowa 'projekt', a on mi wyświetla:
Pierwsze wystapienie tekstu:
tutaj nie ma
moj projekt
okkaaaaaaaaabartek@bartek-F3Sg:~$ ^C

Chcę żeby program wyświetlił mi wszystkie linijki, w których jest szukana fraza...

0

Weźmy tekst poniżej i wyszukajmy programem ciąg "JAN":

abcdefghijklmnopqrstuvwxyz,./;"JAN][=-_ZYXWVUTSRQPONMLKJIHGFEDCBA
aA bB cC dD eE fF gG hH iI

Twój programik, jak widzę, znajdzie numer znaku, od którego zaczyna się tekst JAN (czyli przy numeracji od zera - 31) i następnie wypisuje: 20 znaków do tyłu, nasz znak i 20 znaków do przodu (bez 20-tego). Czyli byś dostał znaki od 11 do 50:
mnopqrstuvwxyz,./;"JAN][=-_ZYXWVUTSRQPO

Aby to zmienić, patrz na ten kod:

for(p=ptr-20;p<ptr+20;p++) //znaki od ptr-20 do ptr+19 (ptr - początek frazy)
putchar(*p);

Aby dociągnęło do końca linii, musisz sprawdzać, czy wartość pod wskaźnikiem p (czyli *p) nie jest równa 10 (nowa linia, "\n"). Można użyć while:

p = ptr; //zaczniemy dopiero od tekstu "JAN"
while(*p != 10){ //dopóki p nie wskazuje na znak końca linii
  putchar(*p); //wypisujemy znak
  p++; //bierzemy kolejny znak
}
putchar(10); //to dodatkowo, aby po każdej znalezionej frazie szło do nowej linii
0

Teraz wypisuje mi tylko od szukanej frazy do końca linijki, a ja chciałbym, żeby wypisało mi całą linijkę, w której jest szukana fraza.
Ale ważniejsze jest to: jak zamknąć tą instrukcję w pętlę, żeby wyświetlało mi wszystkie przypadki wystąpienia frazy?

0
Patryk27 napisał(a)

Na cpp się nie znam za dobrze

faktycznie skoro nie odróżniasz C od C++.

0

Zamiast osobistych zgryźliwości, powiedzcie mi w którym miejscu mam wstawić while(getchar() != EOF albo coś podobnego, żeby program wyszukał mi wszystkie wystąpienia frazy

1 użytkowników online, w tym zalogowanych: 0, gości: 1