Sprawdzanie , czy dana fraza występuje w stringu

0
std::string myString="ala ma kota";

Powiedzmy, że chcę sprawdzić czy w myString istnieje słowo "kota".

myString.find("kota");

Funkcja ta zamiast wartości boolowskich zwraca numer pozycji w której zaczyna się wyszukiwana fraza. Ktoś się może spytać - "no dobra ok, i co to ma do rzeczy? " . A no ma, bo gdy słowo nie występuje(np. myString.find("kanarka") zamiast false zwracana jest liczba z kosmosu: 4294967295. Dlaczego akurat taka, skoro 4294967291 to maksymalny rozmiar stringa?

źródło:
http://www.cplusplus.com/reference/string/string/capacity/

I czy jest jakaś odpowiadająca funkcja typu bool?Bo wyrażenie if (myString.find(cosdoznalezienia)!=superduzaliczba) wygląda niezbyt profesjonalnie...

3

Jak nic nie znajdzie to zwraca string::npos.

2

Zwraca npos czyli -1. Nie rzutuj tego na unsigned.

1

Nie latwiej samemu napisac ;p np.

bool find_pattern(int patternlength, string pattern, string word)
{
    int length=0;
    int mem=0;
    bool next=false;
    for(int i=0;i<word.length();i++)
    {
        if(word[i]==pattern[length])
        {
            length++;
            mem=i;
            next=true;
        }
        if(length==patternlength)
        {
            return true;
        }
        if(mem!=i)
        {
            next=false;
            length=0;
        }
    }
    return false;
}
1
template<class T>
bool IsSubstring(const std::basic_string<T> &haystack, const T* needle)
{
	return haystack.find(needle) != std::basic_string<T>::npos;
}
std::basic_string<TCHAR> tstr = TEXT("testowy napis");
std::string str = "testowy napis";
std::wstring wstr = L"testowy napis";

bool result_tstr = IsSubstring(tstr, TEXT("nap"));
bool result_str = IsSubstring(str, "nap");
bool result_wstr = IsSubstring(wstr, L"nap");
0
Krycho napisał(a)

Nie latwiej samemu napisac ;p np.

bool find_pattern(int patternlength, string pattern, string word)
{
    int length=0;
    int mem=0;
    bool next=false;
    for(int i=0;i<word.length();i++)
    {
        if(word[i]==pattern[length])
        {
            length++;
            mem=i;
            next=true;
        }
        if(length==patternlength)
        {
            return true;
        }
        if(mem!=i)
        {
            next=false;
            length=0;
        }
    }
    return false;
}

po co ci geniuszu ta zmienna next? Żeby było szybciej niż w stl'u?

0

bo oryginalnie "geniuszu" uzywalem do czego innego tej funkcji a ta zmienna miala uniemozliwic zliczenie blednych powtorzen...

0

No i widzisz, jednak nie napisałeś sam tej funkcji w kilkanaście sekund, tylko skopiowałeś inną i próbowałeś przerabiać. No, ale jeżeli według ciebie programowanie na CTRL-C, CTRL-V to wciąż lepsze rozwiązanie niż użycie odpowiednich metod z STL to.. ja wymiękam.

0

Napisalem sam to raz, a dwa wpadniecie na pomysl i napisanie zajelo mi hmm gora 2 min? Nie usunalem 1 zmiennej i 1 ifa, straszne... autor gdyby chcial jej uzyc i tak raczej przeanalizowalby jak dziala i usunal to sobie sam.

0

Ja rozumiem, że jesteście tak super_duper_zajebisci, że za ujmę na honorze uważacie korzystanie z gotowych bibliotek ale bez przesady. Nie każdy jest tak super_duper i zamiast marnować czas na wynajdowanie koła od nowa wolą szybciej dojść do celu.

0

Powiem inaczej. Akurat w tym wypadku przy zadaniu na spoju kiedy korzystalem z metody find stringa, czas wykonania zadania byl spory bo az 1.8s dla warunkow zadania, a ze chcialem miec lepszy czas to zrobilem to w troche inny sposob tak zeby wykonywalo sie to ponizej 0.2s. Na dodatek musialem wylaczyc sync_stdio bo takto czas wynosil 2.6s jak dobrze pamietam. Tak wiec sry, ale czasami wole nie isc na latwizne tylko pomyslec chwile i zrobic cos sam...

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