• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] - Wyszukiwanie więcej niż jednego wzorca w danej zmiennej.

Object Storage Arubacloud
0 głosów
640 wizyt
pytanie zadane 9 stycznia 2016 w C i C++ przez xCodezaur Bywalec (2,850 p.)
edycja 16 stycznia 2016 przez xCodezaur

Witam,

Czy da radę odszukać więcej niż jeden fragment w danym tekście ? Przykładowo znaleźć w tekście domenę ".pl" albo ".com".

#include <iostream>

using namespace std;

string tresc;
int pozycja;
int x;

int main()
{
    cout << "Podaj tresc: ";
    getline(cin,tresc);

    cout << endl;

    x = tresc.length();

    pozycja = tresc.find((".pl") || (".com"));

    if (pozycja!=string::npos)
    {
        tresc.replace(0,x,"***CENZURA***");
        cout << "Niedozwolone slowo!" << endl << endl;
    }

    cout << "CHAT: " << endl << endl;;
    cout << tresc << endl;

    return 0;
}

Tutaj przykładowo próbowałem sposobem "||" (lub), który nie przyniósł żadnych efektów.

Może są jakieś inne funkcje wyszukujące kilka fragmentów w danym wyrazie, lub po prostu nie ma na to sposobu.

Z góry dziękuje za poświęcenie czasu na odpowiedź smiley

2 odpowiedzi

+1 głos
odpowiedź 9 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 9 stycznia 2016 przez xCodezaur
 
Najlepsza

Skorzystaj po prostu z metody find kilka razy.

komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Musiałbym kilka razy wprowadzać też ifa sprawdzającego czy znaleziono fragment na pozycji. Bo jeśli został by tylko jeden, to brało by pod uwagę tylko ostatniego find'a.
komentarz 9 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Stwórz więc specjalną funkcję.
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Nie rozumiem, i w tej funkcji umieścić tyle ifów czy wtedy nie będzie konieczności umieszczania ich tyle razy ? Myślę, że jeśli trzeba użyć tyle razy ifów to bez sensu, bo jak bym chciał sprawdzić 30-50 fragmentów ?
komentarz 9 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Wtedy korzystasz z pętli, a dane do funkcji trzymasz np. w tablicy. Ogólnie nie trzeba tworzyć tej funkcji (ale warto dla czytelności kodu) - zaprezentuję więc przykład bez niej:

std::string tekst = "www.mojastrona.pl";
const int wielkosc_tablicy = 3;
std::string tablica[wielkosc_tablicy] = {".pl", ".com", ".org"};
for(int i = 0; i < wielkosc_tablicy; i++)
{
	int pozycja = tekst.find(tablica[i]);
	if(pozycja != std::string::npos)
		std::cout << "Uwaga, znaleziono \"" << tablica[i] << "\"" << std::endl;	
}

Wyjście:

Uwaga, znaleziono ".pl"

komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)

Szczerze mówiąc właśnie teraz, jeszcze nie zerkając na forum też wpadłem, aby zrobić to w pętli i się udało :).

#include <iostream>

using namespace std;

string zakazane[2]={".pl",".com"};
string tresc;
int pozycja;
int x;

int main()
{
    cout << "Podaj tresc: ";
    getline(cin,tresc);

    cout << endl;

    x = tresc.length();

    for(int i=0; i<2; i++)
    {
        pozycja = tresc.find(zakazane[i]);

        if (pozycja!=string::npos)
        {
            tresc.replace(0,x,"***CENZURA***");
            cout << "Niedozwolone slowo!" << endl << endl;
        }
    }

        cout << "CHAT: " << endl << endl;;
        cout << tresc << endl;

    return 0;
}

Dzięki za odpowiedź i tak przy okazji, to co oznacza te const przed intem ?

komentarz 9 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Tworzy stałą (w przeciwieństwie do zmiennej, jej wartości nie można zmieniać).
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Ok, dzięki na pewno się przyda :)
+1 głos
odpowiedź 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Aj, chyba zapomniałem dodać, że jestem jeszcze początkujący. Mógłbyś mi to jakoś skrócić bo nie mogę nic zrozumieć z tej strony.
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Nie wiem czy się dobrze zrozumieliśmy, ponieważ nie chodziło mi o wielokrotne wyszukiwanie jednego wzorca w tekście tylko o wyszukanie w tekście spośród paru wzorców np. ".pl", ".com", ".net".
komentarz 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
No to wystarczy odpowiednio zmodyfikować, jak znajdzie jeden z wzorców, to przerwij pętlę
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
No średnio wiem jak, ale już uzyskałem odpowiedź. Dzięki i Tobie również, bo też miałem problem z wyszukiwaniem paru wzorców w jednym tekście.
komentarz 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
#include <iostream>
 
using namespace std;
 
string tresc;
int x;
 
bool szukaj_wzorca(string tresc){
string tab[3]={".pl",".com",".net"};
for(int k=0;k<2;++k){
	for(int i=0;i<tresc.length()-1;++i){
		if(tresc[i]==tab[k][0]){
			for(int j=0;j<tab[k].length()-1;++j){
				if(tresc[i+j]!=tab[k][i]){
					
				}
				return true;
			}
		}
	}
}
	return false;
}
 
int main()
{
    cout << "Podaj tresc: ";
    getline(cin,tresc);
    cout << endl;
    if(szukaj_wzorca(tresc))
    	cout<<"znaleziono";
    else
    	cout<<"nie znaleziono";
    return 0;
}

 

komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
No to właśnie otrzymałem taką odpowiedź chwilę wcześniej, z użyciem jednej pętli.

Ale jak już mówiłem i tak dzięki, za poświęcenie czasu i podanie tamtych linków :)
komentarz 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
Dzięki Tobie w końcu napisałem program do wyszukiwania wzorca w tekście :)
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
O widzisz, to we dwóch na tym temacie skorzystaliśmy :)
komentarz 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
Musisz sobie odpowiedzieć na pytanie: Chcesz znać nazwy funkcji, czy algorytm? Ja jestem zwolennikiem pisania własnych funkcji.. Jak widzę pytanie "Jak zamienić string na int" to po prostu.. :/
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
Na razie za wcześnie na takie pytanie, a z twojego programu nie wiedziałem paru rzeczy pokroju "return true", w pętli "j", w pętli "k", oraz używania "++k" zamiast "k++". Może "return true" jeszcze bym zrozumiał, zwraca się jeśli prawda, lecz reszty jeszcze nie miałem okazji poznać. Na razie uczę się z kursu Pana Mirosława i jestem obecnie na 9 odcinku.
komentarz 9 stycznia 2016 przez Colossus Mądrala (6,410 p.)
return true - zwraca prawdę. Nawiązując do programu, jeśli znajdzie w tekście ".pl" to wychodzi z funkcji i zwraca prawdę, czyli dalej już nie szuka czy jest ".com" lub ".net"

++k - zwiększ zmienną k o 1, później sprawdź warunek

k++ - sprawdź warunek, później zwiększ zmienną k o 1
komentarz 9 stycznia 2016 przez xCodezaur Bywalec (2,850 p.)
O dzięki, kiedyś własnie potrzebowałem, aby się tak działo, ale jeszcze tego nie znałem. A tak w ogóle to w pętli for może być obojętna literka czy zawsze musi to być albo "i" albo "j" albo "k" ?

Podobne pytania

+3 głosów
4 odpowiedzi 241 wizyt
pytanie zadane 3 lipca 2017 w Sprawy forum przez kordix Gaduła (3,870 p.)
0 głosów
1 odpowiedź 401 wizyt
pytanie zadane 28 maja 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez AlpenGod Nowicjusz (170 p.)

92,624 zapytań

141,482 odpowiedzi

319,825 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...