Tablica stringów oraz ich porównywanie

Odpowiedz Nowy wątek
2014-12-12 23:10
0

Witam.
Mam pytanie. Posiadam dynamiczną tablicę z różnymi stringami. Teraz mam porównać, czy jeden dowolny string zaczyna się drugim z tablicy. Więc potrzebuję szybkiej funkcji, która za argumenty pobierze string przeszukiwany i wzorzec, tak że np. (str1 - 5 elementów, str2 - 3 elementy) str1[0] = str2[0], str1[1] = str2[1], str1[2] = str2[2] -> więc początek str1 to str2. Chciałem użyć strstr, ale to działa chyba tylko dla tablicy char. Jakieś pomocne funkcje, żeby nie pisać tego od samego początku? Cel - funkcja zwraca 1, jeżeli str2 to początek str1. Coś ze string.h? Aha, argumentem powinien być element tablicy stringów, ale to chyba raczej zawsze zadziała, jeżeli działa z pojedynczym stringiem.
Dziękuję za pomoc.

Pozostało 580 znaków

2014-12-12 23:12
1

http://www.cplusplus.com/reference/string/string/find/ ?


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2014-12-12 23:18
0

Dzięki. A mógłbyś napisać teraz przykładowe 2 linijki kodu z tą funkcją?
tab_stringow[2], tab_stringow[5]
2 to np. abcd, a 5 to ab
Teraz jak napisać kod z tą funkcją, która zwróci mi, że tab_stringow[2] zaczyna się stringiem z 6. pozycji tablicy - tab_stringow[5].

Pozostało 580 znaków

2014-12-12 23:24
1

W sumie to nawet find nie trzeba. Wystarczy substr.

for(string &prefix : prefixes){
  string inputPart = input.substring(0, prefix.length());
  if(inputPart == prefix){
    //pasujacy prefix
  }
}

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2014-12-12 23:27
0

To jeszcze, gdybyś mógł wytłumaczyć, gdzie mam podać te stringi (jako elementy tablicy stringów).

EDIT:
Chyba sobie poradziłem z użyciem find.

 ifstartsame(tab_wartosci_kartek[sprawdzany_pojedynczy], tab_wartosci_kartek[kolejne]);
//kod funkcji ifstartsame, ktora znaczy troche co innego niz robi :)
int ifstartsame (string str1, string str2){
size_t found = str1.find(str2);
if (found==0)
    cout << str1 << " zaczyna sie w pelni " << str2 << endl; 

Jednak, gdybyś mógł uzupełnić o tamto, co poprosiłem, zobaczyłbym i ten drugi sposób. Co sądzisz o tym sposobie, jest dobry?

edytowany 1x, ostatnio: LuIMi, 2014-12-12 23:49

Pozostało 580 znaków

2014-12-12 23:50
1

? Nie rozumiem pytania. W kodzie powyżej widać ze "brakuje" dwóch rzeczy -> zmiennej input która, jak sama nazwa wskazuje, jest stringiem dla którego szukamy prefixu, oraz kolekcji prefixes która, jak nie trudno sie domyślić, zawiera potencjalne prefixy. Gdzie jest problem? o_O

Nie doczytałes chyba w dokumentacji co dokładnie robi find. Nie dopasowuje "od początku" tylko szuka wystąpienia stringa. Więc na przykład dla:
"abc" i "bc" zwróci ci że znalazł dopasowanie bo "bc" zawiera sie w "abc"


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2014-12-12 23:52

Pozostało 580 znaków

2014-12-12 23:55
0

A to nie jest tak, że zmienna found oznacza index string'a? Jak nie to doczytam. (Sprawdziłem dla abc i bc, chyba jest to dobry kod, tzn. spełnia założenie). W Twoim kodzie zmienną input zamienię na zmienną typu string, ale nie rozumiem o co chodzi z kolekcją "prefixes", tam mam podać zmienną typu string, którą chcę sprawdzić, czy stanowi początek zmiennej input?

edytowany 2x, ostatnio: LuIMi, 2014-12-12 23:58

Pozostało 580 znaków

2014-12-13 00:07
1

Ok, źle cię trochę zrozumiałem ;] Ja zrozumiałem że chcesz dla danego stringa X wyszukać prefix wśród całej potencjalnej tablicy prefixów. A ty chcesz to zrobić tylko dla 2 konkretnych stringów? To PO CO piszesz o jakiejś tablicy? o_O

Poza tym napisałes wyraźnie że interesuje cię czy jeden ze stringów "zaczyna się" drugim. Kod który wstawiłeś wcale tego nie sprawdza, bo sprawdza czy "jeden string występuje w drugim".
Kod który robi to co chcesz:

bool czy(string& jeden, string& dwa){
  string przyciete = dwa.substring(0, jeden.length());
  return przyciete == jeden;
}

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2014-12-13 00:13
0

Piszę o tablicy stringów, gdyż jest to ponad samą funkcją, nie byłem pewien, czegoś tam, ale nieważne. Muszę jeszcze sobie zrobić przeszukiwanie dla wszystkich stringów z tej tablicy - dlatego o niej tak tylko napomniałem, ale tamto sobie zrobię na spokojnie. Nadal wydaje mi się, że mój kod jest dobry, dla 2 stringów przekazanych w funkcji sprawdza za pomocą find, czy str2 jest w str1, ale zwraca też zmienną found, która mówi mi na którym miejscu. W każdym razie wpisałem do programu "abc" i "bc" i nie otrzymałem tego, co powiedziałeś. Jutro spojrzę na to jeszcze na świeżo i się upewnię. Dzięki za pomoc. Możliwe, że jeszcze tu napiszę, np. jutro.

edytowany 1x, ostatnio: LuIMi, 2014-12-13 00:14
Nie no jasne że jak potem porównasz z 0 to będzie ok. Ale będzie to trochę nieoptymalne ;] - Shalom 2014-12-13 00:22
Rozumiem, że proponujesz swój jako bardziej optymalny. Dzięki ;) - LuIMi 2014-12-13 00:24

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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