x-kom hosting

[C] Proszę o pomoc przy napisaniu programu

wisniewski.bm
utworzono
utworzono

Tak jak w temacie; muszę napisać program, który wyszuka zadany ciąg znaków w pliku tekstowym.

Napisałem coś takiego, ale to nie działa tak jak potrzeba:
[code]
#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=(char*)memchr(ptr,fraza[0],buflen))!=NULL){
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);
}
}
[/code]

wojtex5
komentarz
komentarz

niedawno pisałem podobny programik w C++ (ale w sumie to prawie czyste C).
miał pobierać długość klucza, następnie sam klucz i na końcu tekst, w którym klucz ma być wyszukany.
następnie szukał frazy w tekście i wyświetlał pozycję, na której zaczyna się klucz (mogło być ich wiele).

oto fragment mojego kodu: [code]
int n; //długość klucza
scanf("%d",&n);
char klucz[n+1];
std::string linia; //ten fragment spokojnie możesz zastąpić "char linia[100000];"
scanf("%s",&klucz); //pobranie samego klucza
std::cin>>linia; //ten fragment możesz zastąpić "scanf("%s",&linia);"
int gdzie=0;
if(n<=linia.size())
{
for(int j=0;j<linia.size();j++) // linia.size() możesz spokojnie zmienić na "strlen(linia)"
{
bool czy_znaleziona=true;
for(int k=0;k<n;k++)
{
if(linia[j+k]!=klucz[k]) {czy_znaleziona=false;break;}
if(k+j>=linia.size()) {czy_znaleziona=false;break;} //tutaj to samo - "strlen(linia)"
}
if(czy_znaleziona==true) printf("%d\n",j);
}
}[/code]

dość łatwo przerobić ten kod pod twoją funkcję void szukaj(char *fraza, int buflen)

poprzerabiaj tablice na wskaźniki i powinno śmigać.

wisniewski.bm
komentarz
komentarz

Wiem, że roszę o dużo, ale dopiero rozpoczynam programowanie. Mógłbyś powiedzieć jak to przerobić?

wojtex5
komentarz
komentarz

AAAAA...
dobra :D
myślałem że masz z tym już dłużej styczność.

Szczerze mówiąc to z tymi wskaźnikami to sie troszke przeliczyłem - w ogóle nie były potrzebne, tzn nie trzeba było tego aż tak przerabiać (żadnego nie dodałem)

przerobiłem twoją funkcję szukaj na moją, i program działa idealnie.
narazie program pokazuje pozycję na której zaczyna się fraza w tekście, ale łatwo przystosujesz go do swoich potrzeb.
[code]#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFSIZE 1024
char buf[BUFFSIZE];
bool czy_w_ogole_znaleziona=false;
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);
if(czy_w_ogole_znaleziona==false) printf("nie znalazlem podanej frazy");
close(inf);

return(0);
}
void szukaj(char *fraza, int buflen)
{
char *ptr, *p;
ptr=buf;

for(int j=0;j<buflen;j++) // wykorzystanie buflen jako długości tekstu (u mnie było to linia.size())
{
bool czy_znaleziona=true; //przyjmujemy że fraza jest w tekście, co zaraz sprawdzimy
for(int k=0;k<strlen(fraza);k++)
{ //sprawdzanie czy fraza jest w tekście
if(ptr[j+k]!=fraza[k]) {czy_znaleziona=false;break;}
if(k+j>=buflen) {czy_znaleziona=false;break;} //jeśli nie ma to ustawiamy zmienną czy_znaleziona na false
}
if(czy_znaleziona==true) {czy_w_ogole_znaleziona=true;printf("ciąg rozpoczyna się na %d pozycji.\n",j);} //czy udało się znaleźć? jak tak to wyświetl pozycję.
}
}
[/code]

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.