Więc tak - Jeśli chodzi o działanie IndexOf to ta funkcja przyjmuje chyba ponad 13 różnych argumentów, więc zastosowanie jest szersze zdecydowanie szersze. Ja wykorzystałem tylko dwa, bo tyle było mi potrzeba.
Zastanawia mnie jednak sposób użycia funkcji Find_Between. Za każdym wywołaniem funkcja zaczyna od początku, no chyba, że argument String^ search_data za każdym razem otrzymuje inny łańcuch znaków.
A jak mogłaby zaczynać inaczej ? Każde użycie funkcji to praca na nowym Stringu i wyszukiwanie.
Nie uwzględniasz wariantu, gdy search_data nie zawiera ciągu start_string lub end_string:
Wiem, ale wszystko było pisane na szybko i mi to nie przeszkadzało, a przynajmniej mam pewność gdzie wyskoczy błąd i nie muszę pamiętać o kontrolowaniu zwracanych wartości. Zwróć też uwagę na interpretację zwracanej wartości, w tym wypadku ciągu znaków, który może przecież zawierać wszystko (wycinam tym przeróżne kombinacje znakowe i wartości, które są nieprzewidywalne). Tak więc
return ""
na pewno odpada, bo pokazywałoby błąd gdy funkcja wykona się poprawnie. Takie rzeczy wolę łapać w bloki try i catch. Jednak mniejsza, bo to nie temat.
Ten zapis:
polymorphism napisał(a):
KOD cpp: � UKRYJ �
return search_data->Substring(s1, s2 - s1);
czy raczej ten:
Slynx napisał(a):
KOD cpp: � UKRYJ �
return search_data->Substring(s1 + s3, (s2 - (s1 + s3)));
To zależy od tego, czy funkcja IndexOf zwraca pozycje ostatniego znaku w poszukiwanym ciągu (propozycja polymorphis), czy pierwszego znaku w poszukiwanym ciągu (propozycja Slynx).
Kwestia bardzo istotna. IndexOf zwraca index pierwszego wystąpienia. Ale to nie miałoby i tak znaczenia. Mój zapis jest konieczny, bo funkcja wyszukuje ciąg końcowy (end_string) poczynając od indexu start_string. Ale o tym już pisałem wcześniej. Dlatego to takie skomplikowane i dlatego taki zapis mi się nie podoba. Wygląda trochę zbyt skomplikowanie jak na zwykłe wyszukiwanie ciągu znaków. Albo po prostu tylko mam takie wrażenie.
IndexOf zwraca pozycję szukanego ciągu, czyli indeks pierwszego znaku (jakby było inaczej, byłoby to bez sensu). I dla takiego działania tej funkcji pisany był mój kod - przyjrzyj się dokładnie, a zobaczysz, że Substring dostaje te same wartości indeksów co u Slynxa (przy założeniu wariantu optymistycznego). Po prostu uprościłem zapis..
Nie do końca. Jeśli end_string będzie częścią start_string to funkcja zwróci niepoprawną wartość lub po prostu wyrzuci błąd.
To co zapisałem uwzględnia dodatkowe przesunięcie wynikające z długości start_string (length), by szukanie zacząłem PO a nie PRZED wystąpieniem start_string.
Zastanawiałem się nad użyciem wyrażeń regularnych, ale nie wiem jak i czy to w ogóle będzie miało jakiś sens co do wydajności.