Czy istniej sposób szybszy niż bajt po bajcie przeszukiwania tablicy by znaleźć określony string? Jeśli tak to jaki i proszę o krótki opis, bo c++ dopiero się uczę.
0
0
#include <stdio.h>
char* mystrstr(char* haystack,char* needle){
while(*haystack){ // tu moze byc 1/TRUE, wtedy wyjscie nastapi poprzez warunek if(!*haystack)
char* s=needle;
while(*s!=*haystack && *haystack)haystack++; // dopoki pierwszy znak szukanego ciagu jest rozny od kolejnych znakow w haystack
if(!*haystack)return 0; // w calym ciagu nie znalazl sie ani razu pierwszy znak poszukiwanego podciagu.
char* p=haystack; // zapamietaj pozycje
do{ // sprawdz czy cale needle miesci sie w haystack
haystack++; // pierwszego znaku nie trzeba sprawdzac, wiadomo, sa rowne
s++;
}while(*s==*haystack && *s && *haystack);
if(!*s)return p; // wszystkie znaki byly jednakowe az do konca, niestety trzeba sprawdzic ponownie wartosc *s
haystack=++p; // powrot do zapamietanej pozycji+1
}
return 0; // jesli w warunku petli nie ma 1/TRUE
}
int main(){
char* base="Ala ma kota , psa i goryla 1112";
char* search[]={"ma","kota"," ","Ala","dupa","goryla_","la","11","12",0};
char** d=search;
while(*d){
char* q=mystrstr(base,*d);
if(q)printf("%s\n",q);
else printf("nie znaleziono ciagu: %s\n",*d);
d++;
}
return 0;
}
Chodzi o to zeby przejsc przez ciag w ktorym szukamy bylo jak najmniej, zeby jak najmniej cofac sie do zapamietanej pozycji.
Mozna jeszcze ewentualnie sprawdzac w petli 'while(*s==*haystack && *s && *haystack){' czy *haystack!=*p i odpowiednio zapamietywac pozycje, aby potem nie przypisywac haystack ++p tylko ponowne wystapienie pierwszego znaku z szukanego ciagu, ale doda to tylko jeden warunek do sprawdzenia wiecej w petli ktora porownuje znaki.