Práce se string, vyhledávání řetězců – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce se string, vyhledávání řetězců – C / C++ – Fórum – Programujte.comPráce se string, vyhledávání řetězců – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1600 příspěvků
20. 11. 2013   #1
-
0
-

Pěkný večer,

snažím se udělat jednu úlohu a narazil jsem na problém. Snažím se vyhledávat ze zadaného řetězce, řetězec a znak. Pro lepší pochopení příklad vstupu a výstupu:

vstup:

ahojprogramujivcplusplus

lu

a

výstup:

Retezec 'lu' byl nalezen na pozici: 17, 21

Znak byl v řetězci zobrazen: 2 krat

Tu část kódu pro hledání znaku, u mojeho př. znak 'a' jsem vymyslel ale nejde mi udělat ta část kde hledám zadaný řetězec, u mojeho př 'lu' . Snažím se to dělat přes stringy. Zatím můj kód, kde bohužel není nic o hledaném řetězci, protože všechny moje pokusy nefungují.

#include <iostream>

using namespace std;

void porovnej_znak(string retezec, string znak)
{
    int znak_pocet = 0;

    for(unsigned int i=0; i<retezec.length(); i++)
    {
        if(retezec[i] == znak[0]) znak_pocet++;
    }

    cout << "Znak byl v řetězci zobrazen: " << znak_pocet << " krat." << endl;
}

int main()
{
    string retezec, znak;

    cout << "Zadejte řetězec a znak pro porovnání:\n";
    cin >> retezec >> znak;

    porovnej_znak(retezec, znak);
}


Pokud by někdo věděl jak mě nakopnout nebo mi poskytl jak na to, budu rád :)

Děkuji pěkně.

Nahlásit jako SPAM
IP: 78.102.188.–
Robo
~ Anonymní uživatel
82 příspěvků
21. 11. 2013   #2
-
0
-

#1 Martin
Dá sa to spraviť viacerými spôsobmi (je nato aj funkcia strstr() definovaná v cstring)

Môj program pracuje tak, že si vytvorím pomocný string dĺžky hľadaného znaku. Následne idem porovnávať reťazce a keď narazím na prvú zhodu, tak do toho pomocného reťazca zkopírujem toľko znakov, ako je dlhý pomocný reťazec. Potom už len porovnávam pomocný reťazec s hľadaným znakom a keď je zhoda, tak pripočítam pomocnú premennú temp. Nakoniec mi stačí overiť, či bola zhoda v každom znaku (porovnám dĺžku hľadaného znaku a tempu) a keď bola, tak pripočítam 1 k celkovému počtu.

#include <iostream>
#include <string>

using namespace std;

void porovnaj_znak(string retazec, string znak){
	int count = 0;
	int temp = 0;
	string stemp = znak;


	for(int i = 0; i < retazec.length(); i++){
		if(retazec[i] == znak[0]){
			for(int j = 0; j < znak.length(); j++){
				stemp[j] = retazec[i++];
			}
			i -= znak.length();

			for(int j = 0; j < znak.length(); j++){
				if(stemp[j] == znak[j])
					temp++;
			}
			if(temp == znak.length())
				count++;
		}
		temp = 0;
	}

	cout << "Znak bol zobrazeni " << count << " krat\n";
}

int main()
{
	porovnaj_znak("somtusomtusompretosom", "som");

   system("PAUSE");
   return 0;
}
Nahlásit jako SPAM
IP: 178.253.133.–
vitamin+8
Grafoman
21. 11. 2013   #3
-
0
-

#1 Martin
http://en.cppreference.com/w/cpp/string/basic_string/find

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Martin
~ Anonymní uživatel
1600 příspěvků
21. 11. 2013   #4
-
0
-

Pokusil jsem se tedy něco stvořit :) poměrně to funguje ale rád bych byl aby ta část ,,hledání podřetězce" byla v nějakém cyklu, který v případě, že se v řetězci podřetězec nachází vícekrát, vypsal všechny pozice ale ne jen tu první :) zkoušel jsem to hodit do nějakého cyklu ale neúspěšně, děkuji všem co mě nějak nakopnout :)

#include <iostream>

using namespace std;

void porovnej_znak(string retezec, string znak)
{
    int znak_pocet = 0;

    for(unsigned int i=0; i<retezec.length(); i++)
    {
        if(retezec[i] == znak[0]) znak_pocet++;
    }

    cout << "Znak '" << znak << "' byl v řetězci zobrazen: " << znak_pocet << " krat." << endl;
}

int main()
{
    string retezec, znak, podretezec;

    cout << "Zadejte řetězec, podřetězec a znak pro porovnání:\n";
    cin >> retezec >> podretezec >> znak;

    if(!cin.good() || (retezec.length() > 100))
    {
        cout << "Nespravny vstup.\n";
        return 1;
    }

    //Hledání podřetězce
    int hledej = retezec.find(podretezec);
    if(hledej == string::npos)
    {
        cout << "Podřetězec '" << podretezec << "' se v řetězci nenachází.\n";
    }
    else
    {
        cout << "Podřetězec '" << podretezec << "' se v řetězci nachází na pozici: " << hledej << endl;
    }

    porovnej_znak(retezec, znak);
}
Nahlásit jako SPAM
IP: 46.13.181.–
vitamin+8
Grafoman
21. 11. 2013   #5
-
0
-

#4 Martin
 

#include <iostream>
#include <string>

int main(){
    using namespace std;

    string str = "str strstr str";
    string x = "str";

    size_t count = 0;
    size_t pos = str.find(x, 0);    //vyhladas v stringu @str substring @x od 0 pozicie a vrati jeho poziciu

    while(pos != string::npos){     //string::npos je konstanta co reprezentuje neplatnu poziciu v stringu
        ++count;
        pos=str.find(x, pos+x.size());  
    };

    cout << "pocet vyskytov \"" << x << "\" v stringu \"" << str << "\" == " << count << '\n';

    return 0;
}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý