wisniewski.bm utworzono 4 grudnia 2010 utworzono 4 grudnia 2010 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 5 grudnia 2010 komentarz 5 grudnia 2010 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 5 grudnia 2010 Autor komentarz 5 grudnia 2010 Wiem, że roszę o dużo, ale dopiero rozpoczynam programowanie. Mógłbyś powiedzieć jak to przerobić?
wojtex5 komentarz 5 grudnia 2010 komentarz 5 grudnia 2010 AAAAA... dobra 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.