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