Wyszukiwanie w stringu

0

Witam chce zrobić program któremu najpierw podajemy zestaw imion a później chcemy przeszukać ten zestaw taki sposób.
kiedy wpisze ma* to powinien mi wypisać mateusz,marek(i tak dalej) i tak dalej kiedy wpisze ri to wypisze mi Adrian,Adriana(i tak dalej) i ja wpisze *ta to wypisze mi coś takiego Arletta,Arleta (i tak dalej). Na razie chciałem zrobić przez (tylko wariant pierwszy) find_first_of ale wywala mi taki błąd request for member 'find_first_of' in 'first_test.chain_of_signs::sign', which is of non-class type 'std::string [2] {aka std::basic_string<char> [2]}'

 #include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
class chain_of_signs //łancuch znaków
{
public:
    int column;

    string sign[2];        // kolumny i rzędy
    string sign_campare;

    void set_add_name();
    void set_campare/*porównanie*/( string sign_campare );
};
//------------------------------------------------------------------
void chain_of_signs::set_add_name()
{
    for ( column = 0; column < 2 ; column++)
    {
            cout << "Podaj imie: " << endl;
            cin >> sign[column];
            system( "clear" );
    }
}
//------------------------------------------------------------------
void chain_of_signs::set_campare( string sign_campare )
{
    for ( column = 0 ; column < 2 ; column++)
    {
        if ( sign[column] == sign_campare )
        {
            system( "clear" );
            cout << "Mamy te sam imiona " << endl;
            break;
        }
        else if ( sign[column] != sign_campare )
        {
            system( "clear" );
            cout << "Podales inne imiona " << endl;
            break;
        }
    }
}
//-------------------------------------------------------------------
int main()
{
    chain_of_signs first_test;
    first_test.set_add_name();

    cout << "Podaj imie do porównania ";
    cin >> first_test.sign_campare;

    string::size_type pozycja;
    pozycja = first_test.sign.find_first_of("mat");
    if ( pozycja != string::npos )
    {
        cout << "znalazles " << first_test.sign << endl;
    }


    first_test.set_campare( first_test.sign_campare );

    return 0;
}

2

To już istnieje i nazywa się wyrażenia regularne.

4

Próbujesz wywołać metodę find_first_of na TABLICY obiektów std::string.

1

87kelthuzad, rozumiem, że nie interesują Cię wyrażenia regularne, tylko po prosu chcesz się pouczyć C++.

Jednakże, Twój kod czyta się bardzo ciężko (mimo, że krótki) ze względu na błędy w języku angielskim... Pisz lepiej to po polsku... Zanim się domyśliłem, co możesz mieć na myśli pisząc chain_of_signs, set_add_name, campare... :)

find_first_of powinna być chyba w pętli na elementach tablicy, nie na tablicy -- jeśli widzę dobrze, coś napisał...

1

chcemy przeszukać ten zestaw taki sposób.
kiedy wpisze ma* to powinien mi wypisać mateusz,marek

#include <iostream>
#include <string>
#include <vector>
#include <locale>

bool isFoundPhrase(const std::string& name, const std::string& phrase)
{
	std::locale loc;
	std::string temp;

	for (char elem : name){
		temp.push_back(std::tolower(elem, loc));
	}

	if (temp.find(phrase) != std::string::npos)
		return true;
	else
		return false;
}

auto main() ->int
{
	std::vector<std::string> names{
		"Mateusz", "Marek", "Arletta", "Arleta", "Adrianna", "Adrian"
	};
	bool isFoundNames = false;

	std::string phrase;
	std::cout << "wprowadz szukana fraze: ";
	std::cin >> phrase;
	for (auto const& elem : names){
		if (isFoundPhrase(elem, phrase)){
			isFoundNames = true;
			std::cout << elem << '\n';
		}
	}

	if (!isFoundNames){
		std::cout << "Fraza nie zostala odnaleziona." << '\n';
	}
} 
0

dzięki wielki za odpowiedzi mam kilka co do twojego programu carlosmay (Wielkie dzięki ale będę jeszcze myślał jak to zrobić po swojemu :D):

1.czy for (char elem : name) to chodzi o to ze for leci po imionach od początku vectora do końca czyli od Mateusz do Adriana.

  1. O co chodzi ze zmienną locale. Szukałem na internecie i znalazłem coś takiego http://www.cplusplus.com/reference/locale/ ale niestety mój angielski nie jest najlepszy (zresztą widać po nazwach zmiennych) i w moich książkach też tego nie znalazłem (mam Symfonie C++ i Język C++. Kompendium wiedzy ).

3.Czy & oznaczają przypisanie do wskaźnika?

4.Auto to też jest jakieś dziwne.

  1. temp.push_back(std::tolower(elem, loc)) czy chodzi tu że temp robi za name (imiona) i wyjmujemy je z vectora i zamieniamy wszystkie elementy na małe litery?

  2. If (temp.find(phrase) != std::npos) teraz widzie że nie potrzebnie stosowałem find_first_of a wystarczyło mi find ale nie kumam time.find czy to chodzi ze wzór na find jest taki:
    size_type find( value_type ch, size_type off = 0 ) const;
    size_type find( const value_type * ptr, size_type off = 0 ) const;
    size_type find( const value_type * ptr, size_type off, size_type count ) const;
    size_type find( const basic_string & str, size_type off = 0 ) const;
    i dlatego nie kumam o co chodzi z temp.find i za co odpowiada temp czy na pewno jest to odniesienie do name.

0
  1. Tak. To jest pętla oparta na zakresie. https://pl.wikipedia.org/wiki/C%2B%2B11#P.C4.99tla_for_oparta_na_zakresie
  2. Lokalizmy: ustawia w funkcji std::tolower obecną stronę kodową.
  3. To jest referencja. Przekazywanie parametru przez wartość i referencję
  4. auto - automatyczna dedukcja typu. Można tam wpisać const std::string& elem. https://pl.wikipedia.org/wiki/C%2B%2B11#Automatyczne_okre.C5.9Blenie_typu
  5. temp to zmienna pomocnicza. push_back() wstawia po kolei zamienione na małe litery ze zmiennej name do temp.
  6. temp to imię z małych liter. find() jest metodą należącą do klasy std::string więc używamy jej z obiektem typu std::string, czyli
    zmiennaTypuString.find(szukana fraza, offset domyślny = 0)

edit: wkradł się błąd.
do pkt 1) w tym przypadku for (char elem : name) pętla porusza się po imieniu, znak po znaku i zamienia wszystkie znaki na małe, zapisując wyniki do temp.

edit2:
PS: proponuje zapoznać się z debuggerem.

0

Wielkie dzięki za odpowiedz Carlosmay wieczorem lub jutro poczytam tę stronę z Wikipedii. Trochę pozmieniałem program ale coś dalej nie chce odpalić. Wyskakują mi takie dwa błędy:
1)invalid initialization of reference of type 'const string& {aka const std::basic_string<char>&}' from expression of type 'std::string* {aka std::basic_string<char>*}'
if (isFoundPhrase(first_test.sign,first_test.sign_campare))
2)in passing argument 1 of 'bool isFoundPhrase(const string&, std::string)'
bool isFoundPhrase (const string& sign ,const string sign_campare )

Debugger w ogóle nie odpowiada.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
class chain_of_signs //łancuch znaków
{
public:
    int column;

    string sign[2];        // kolumny i rzędy
    string sign_campare;
    bool isFoundNames = false;

    void set_add_name();
    void set_campare/*porównanie*/( string sign_campare );
    bool isFoundPhrase(const string sign[] ,const string sign_campare );
};
//------------------------------------------------------------------
void chain_of_signs::set_add_name()
{
    for ( column = 0; column < 2 ; column++)
    {
            cout << "Podaj imie: " << endl;
            cin >> sign[column];
            system( "clear" );
    }
}
//------------------------------------------------------------------
void chain_of_signs::set_campare( string sign_campare )
{
    for ( column = 0 ; column < 2 ; column++)
    {
        if ( sign[column] == sign_campare )
        {
            system( "clear" );
            cout << "Mamy te sam imiona " << endl;
            break;
        }
        else if ( sign[column] != sign_campare )
        {
            system( "clear" );
            cout << "Podales inne imiona " << endl;
            break;
        }
    }
}
//===================================================================
bool isFoundPhrase (const string& sign ,const string sign_campare )
{
    string name[2];
    for ( int i = 0 ; i < 2 ; i++ )
    {
        name[i] = tolower(sign[i]);
    }
    if (sign.find(sign_campare) != string::npos)            // zamiast sign musi byc name
        return true;
    else
        return false;
}
//-------------------------------------------------------------------
int main()
{
    chain_of_signs first_test;
    first_test.set_add_name();

    cout << "Podaj imie do porównania ";
    cin >> first_test.sign_campare;

    if (isFoundPhrase(first_test.sign,first_test.sign_campare))
    {
        first_test.isFoundNames = true;
        cout << first_test.sign << endl;
    }
    if (!first_test.isFoundNames)
    {
        cout << "fraza nie znaleziona" << endl;
    }
    /*string::size_type pozycja;
    pozycja = first_test.sign.find_first_of("mat");
    if ( pozycja != string::npos )
    {
        cout << "znalazles " << first_test.sign << endl;
    }
    */

    first_test.set_campare( first_test.sign_campare );

    return 0;
}

 
0
bool isFoundPhrase(const string sign[], const string sign_campare);
// ....
bool isFoundPhrase(const string& sign, const string sign_campare) // brakuje przesterzni nazw, w której znajduje się metoda isFoundPhrase,
                                                                  // oraz niezgodność argumentów między deklaracją i definicją
{ 

// .....
for (int i = 0; i < 2; i++)
    {
        name[i] = tolower(sign[i]); // niezgodność typów (name[i] to znak, sign[i] to wyraz)
    } 

Podrzuciłem przykład z std::vector<>, czemu upierasz się przy gołej tablicy. Jeśli już skorzystaj z std::array<>.

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