Jak používat string find() v C++

Úvodní slovo:

V programovacím jazyce C++ představuje funkce find() klíčový nástroj pro manipulaci s textovými řetězci. Její schopnost vyhledat pozici určitého podřetězce v rámci daného řetězce otevírá široké možnosti pro práci s textem. Ať už potřebujete zjistit přítomnost konkrétního textu, vyjmout části textu, nebo upravovat formát dat, funkce find() vám efektivně pomůže dosáhnout požadovaného výsledku.

V tomto článku se podrobně zaměříme na funkci find(), objasníme její základní principy a projdeme si praktické příklady jejího použití. Získáte tak dovednosti potřebné k efektivnímu využívání této funkce v různých programovacích situacích a maximálnímu využití jejího potenciálu ve vašich C++ aplikacích.

Princip fungování funkce find():

Funkce find(), která je součástí třídy std::string v C++, primárně slouží k nalezení prvního výskytu zadaného podřetězce v hlavním řetězci. Pokud je hledaný podřetězec nalezen, funkce vrací číselnou hodnotu, která udává pozici prvního znaku podřetězce v hlavním řetězci. V případě, že podřetězec v hlavním řetězci neexistuje, funkce vrátí speciální konstantu std::string::npos, která reprezentuje neplatný index.

Zápis (syntaxe) funkce find():

c++
size_t find(const std::string& str, size_t pos = 0) const;
size_t find(char c, size_t pos = 0) const;

* str: Představuje podřetězec, který se má vyhledat.
* c: Označuje jednotlivý znak, který se má vyhledat.
* pos: Je volitelný argument, který definuje pozici v hlavním řetězci, od které má vyhledávání začít. Jeho výchozí hodnotou je 0, což znamená, že se vyhledávání spouští od začátku celého řetězce.

Ukázka praktického použití:

c++
#include <iostream>
#include <string>

int main() {
std::string text = „Toto je názorný text.“;
std::string hledanyText = „názorný“;

size_t pozice = text.find(hledanyText);

if (pozice != std::string::npos) {
std::cout << „Hledaný podřetězec “ << hledanyText << “ byl nalezen na pozici: “ << pozice << std::endl;
} else {
std::cout << „Hledaný podřetězec “ << hledanyText << “ nebyl nalezen.“ << std::endl;
}

return 0;
}

Výstup tohoto programu bude vypadat takto:

Hledaný podřetězec názorný byl nalezen na pozici: 8

Další možnosti a parametry:

Funkce find() poskytuje několik dalších variant a možností, které vám umožňují efektivnější kontrolu nad hledáním v řetězcích.

1. Vyhledávání od specifického místa:

Pomocí druhého parametru funkce find() můžete určit, od které pozice v hlavním řetězci má vyhledávání začít. Například:

c++
std::string text = "Toto je názorný text.";
size_t pozice = text.find("text", 10);

Tento kód bude hledat podřetězec „text“ počínaje pozicí 10 v řetězci text.

2. Vyhledávání více podřetězců:

Pomocí cyklu můžete funkcí find() vyhledávat všechny výskyty určitého podřetězce v daném řetězci. Například:

c++
std::string text = "Toto je názorný text.";
std::string hledanyText = "názorný";

size_t pozice = 0;
while ((pozice = text.find(hledanyText, pozice)) != std::string::npos) {
std::cout << „Hledaný podřetězec “ << hledanyText << “ byl nalezen na pozici: “ << pozice << std::endl;
pozice += hledanyText.length();
}

Tento kód najde a vypíše pozice všech výskytů podřetězce „názorný“ v řetězci text.

3. Hledání bez ohledu na velikost písmen:

Funkce find() ve spojení s variantou find_first_of a argumentem std::locale::classic() umožňuje vyhledávat podřetězce, aniž by se rozlišovala velikost písmen. Příklad:

c++
std::string text = "Toto je NÁZORNÝ text.";
std::string hledanyText = "názorný";

size_t pozice = text.find_first_of(hledanyText, 0, std::locale::classic()); // ignorecase

if (pozice != std::string::npos) {
std::cout << „Hledaný podřetězec “ << hledanyText << “ byl nalezen na pozici: “ << pozice << std::endl;
} else {
std::cout << „Hledaný podřetězec “ << hledanyText << “ nebyl nalezen.“ << std::endl;
}

Tento příklad najde podřetězec „názorný“ i tehdy, když je v textu zapsán jako „NÁZORNÝ“ s velkými písmeny.

Praktické aplikace funkce find():

1. Ověření uživatelského vstupu:

c++
#include <iostream>
#include <string>

int main() {
std::string vstup;
std::cout << „Zadejte své heslo: „;
std::getline(std::cin, vstup);

if (vstup.find(„heslo“) != std::string::npos) {
std::cout << „Heslo obsahuje zakázané slovo ‚heslo‘.“ << std::endl;
} else {
std::cout << „Heslo je v pořádku.“ << std::endl;
}

return 0;
}

Tento program ověří, zda uživatelské heslo neobsahuje zakázané slovo „heslo“.

2. Získávání dat z textového řetězce:

c++
#include <iostream>
#include <string>

int main() {
std::string text = „Jméno: Jan Novák, Věk: 30 let“;
size_t poziceJmena = text.find(„Jméno:“);
size_t poziceVeke = text.find(„Věk:“);

if (poziceJmena != std::string::npos && poziceVeke != std::string::npos) {
std::string jmeno = text.substr(poziceJmena + 7, poziceVeke – poziceJmena – 7);
std::string vek = text.substr(poziceVeke + 5);

std::cout << „Jméno: “ << jmeno << std::endl;
std::cout << „Věk: “ << vek << std::endl;
} else {
std::cout << „Data nebyla nalezena.“ << std::endl;
}

return 0;
}

Tento program z textového řetězce s osobními údaji extrahuje jméno a věk.

3. Manipulace s textem:

c++
#include <iostream>
#include <string>

int main() {
std::string text = „Toto je text s více slovy.“;

size_t pozice = 0;
while ((pozice = text.find(“ „, pozice)) != std::string::npos) {
std::cout << text.substr(pozice + 1) << std::endl;
pozice += 1;
}

return 0;
}

Tento program vypíše všechna slova z řetězce text na samostatných řádcích.

Závěrem:

Funkce find() představuje silný nástroj pro práci s textovými řetězci v jazyce C++. Umožňuje efektivní vyhledávání podřetězců, ověřování obsahu řetězců, získávání specifických částí textu a provádění dalších operací s řetězci. Kombinací funkce find() s dalšími prostředky a funkcemi C++ můžete zjednodušit zpracování textu, manipulovat s daty a vytvářet robustní a elegantní algoritmy.

Často kladené dotazy:

1. Co se stane, pokud funkce find() nenajde podřetězec?
V takovém případě funkce vrací hodnotu std::string::npos, což je speciální konstanta indikující, že hledaný podřetězec nebyl nalezen.

2. Jaký je rozdíl mezi find(), find_first_of() a find_last_of()?
* Funkce find() vyhledá daný podřetězec v celém řetězci a vrátí index jeho prvního výskytu.
* Funkce find_first_of() vyhledá první výskyt libovolného znaku z daného podřetězce.
* Funkce find_last_of() vyhledá poslední výskyt libovolného znaku z daného podřetězce.

3. Je možné použít find() pro vyhledávání více znaků najednou?
Ano, pomocí funkce find_first_of() můžete vyhledat první výskyt libovolného znaku ze zadaného podřetězce.

4. Jak lze přistoupit k nalezenému podřetězci?
K nalezenému podřetězci můžete přistoupit pomocí funkce substr(), která vytvoří kopii části řetězce od daného indexu.

5. Existují další funkce pro hledání v řetězcích?
Ano, existují i další funkce jako například rfind(), find_first_not_of() a find_last_not_of(), které nabízejí různé varianty vyhledávání.

6. Jak lze zjistit, zda řetězec obsahuje konkrétní znak?
Můžete použít funkci find() s daným znakem jako argument. Pokud funkce nevrátí hodnotu std::string::npos, pak řetězec daný znak obsahuje.

7. Existuje omezení na velikost hledaného podřetězce?
Ne, funkce find() nemá žádné omezení na velikost hledaného podřetězce.

8. Co znamená „std::string::npos“?
std::string::npos je speciální konstanta, která reprezentuje neplatný index v řetězci. Funkce ji vrátí, pokud nenajde hledaný podřetězec.

9. Jaká je výpočetní složitost funkce find()?
Výpočetní složitost funkce find() je lineární, protože v nejhorším případě musí projít celý řetězec, aby nalezla podřetězec.

10. Je funkce find() v C++ citlivá na velikost písmen?
Ano, výchozí implementace funkce find() rozlišuje velikost písmen. Pro vyhledávání bez ohledu na velikost písmen můžete použít variantu find_first_of s argumenty std::locale::classic().

Štítky:

C++, string, find(), vyhledávání, podřetězec, text, zpracování textu, index, pozice, std::string::npos, příklady, FAQ, návod, tutorial