Lekce 10 - Textové řetězce v jazyce C++
V minulé lekci, Nejčastější chyby C++ nováčků - Umíš pojmenovat proměnné?, jsme si ukázali nejčastější chyby začátečníků v C++ ohledně pojmenování proměnných.
S textovými řetězci jsme se již v kurzu letmo setkali, načítali jsme je
a vypisovali pomocí proměnné typu string
. S řetězci lze v C++
pracovat několika způsoby. My si v tomto C++ tutoriálu uvedeme zatím ten
nejjednodušší, tzv. statický řetězec, kterým je právě typ
string
.
Knihovna string
Když budeme chtít uložit do proměnné textový řetězec
"Hello ITnetwork"
, pouze vytvoříme objekt typu
string
a přiřadíme mu řetězec. Zatím nás nemusí trápit,
že vlastně nevíme, co objekt je. Dozvíte se to v sekci věnované OOP.
Nesmíme zapomenout includovat hlavičkový soubor string
:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string pozdrav = "Hello World!";
cout << pozdrav << endl;
cin.get();
return 0;
}
Tak jak jsme to v C++ viděli již několikrát, vypsaný text se objeví na obrazovce a čeká se na stisknutí klávesy od uživatele.
Konzolová aplikace
Hello Wordl!
Práce s jednotlivými znaky
S řetězcem můžeme zacházet úplně stejně jako s polem, protože
interně polem je Není tedy
problém vypsat například první znak nebo znaky měnit. Při jiné manipulaci
s řetězci je lepší použít metody (funkce), které typ
string
poskytuje. My si na konci uvedeme ty základní.
Nyní si pojďme ukázat, jak například změnit první znak a mezi každým písmenem vypsat mezeru:
{CPP_CONSOLE}
string pozdrav = "Hello World!";
pozdrav[0] = 'h';
for (int i = 0; i < 12; i++ )
cout << pozdrav[i] << ' ';
cout << endl;
cin.get();
{/CPP_CONSOLE}
Výsledek:
Konzolová aplikace
h e l l o W o r l d !
Změnou prvního znaku na 'h'
jsme zmenšili první písmeno
textu. Díky hranatým závorkám jsme poté mohli k řetězci přistoupit jako
k poli a vypsat jednotlivé znaky oddělené mezerou.
Čtení/výpis řetězce
Řetězce můžeme jednoduše načítat/vypisovat jako jsme byli zvyklí
doposud, použijeme k tomu objekt cin
. Proměnnou pro řetězec
založíme jako typ string
.
Následující program si nechá zadat vaše jméno a poté vás pozdraví:
{CPP_CONSOLE}
string jmeno;
cout << "Zadejte vase jmeno: ";
cin >> jmeno;
cout << "Zdravim " << jmeno << endl;
cin.ignore(0xFF,'\n');
cin.get();
{/CPP_CONSOLE}
Výsledek nás možná překvapí:
Konzolová aplikace
Zadejte vase jmeno: David Capka
Zdravim David
Všimněme si, že bylo načteno pouze první slovo. Při vstupu pomocí
cin
se čtení ukončí na prvním tzv. bílém znaku. To jsou
znaky, které nelze vytisknout, jako např. mezera, enter nebo tabulátor. Také
si všimněme řádky cin.ignore(0xFF,'\n')
. Ta udává,
že všechen text, který ještě na vstupu čeká, se má ignorovat, a to až
po znak '\n'
, který označuje enter. Pokud bychom tuto metodu
nezavolali, cin.get()
by automaticky přečetl další znak, který
by byl ve frontě a program by se ihned ukončil.
Pokud bychom chtěli přečíst celý řádek, využijeme k tomu funkci
getline()
, která jako první parametr přijímá objekt
cin
a jako druhý řetězec, do kterého text uloží.
{CPP_CONSOLE}
string jmeno;
cout << "Zadejte vase jmeno: ";
getline(cin, jmeno);
cout << "Zdravim " << jmeno << endl;
cin.get();
{/CPP_CONSOLE}
Standardní funkce pro práci s řetězci
Typ string
nám poskytuje mnoho připravených funkcí pro
práci s řetězci, které zjednoduší naše programy.
length()
- délka řetězce
Délku řetězce můžeme zjistit pomocí metody length()
(podrobnější popis rozdílu mezi metodou a funkcí je opět součástí kurzu
OOP).
{CPP_CONSOLE}
string pozdrav = "Hello World";
unsigned int delka = pozdrav.length();
cout << delka;
{/CPP_CONSOLE}
clear()
- smazání řetězce
Pokud chceme uvolnit místo, použijeme metodu clear()
. Ta
smaže všechen obsah, který je v proměnné uložen.
string pozdrav = "Hello World";
pozdrav.clear();
Spojení řetězců
2 textové řetězce můžeme spojit do jednoho pomocí operace
+
, jak jsme zvyklí například u aritmetických operací.
{CPP_CONSOLE}
string prvniPozdrav = "Hello ";
string druhyPozdrav = "World";
string pozdrav = prvniPozdrav + druhyPozdrav;
cout << pozdrav;
{/CPP_CONSOLE}
find()
- vyhledání
podřetězce
V textu si můžeme nechat vyhledat nějaký znak nebo řetězec. C++ ho od začátku do konce prohledá a pokud znak nebo řetězec nalezne, vrátí jeho pozici. Pokud řetězec znak neobsahuje, vrátí metoda hodnotu větší, než je poslední index řetězce.
{CPP_CONSOLE}
string text = "Wolfgang Amadeus Mozart";
unsigned int pozice = text.find("Amadeus");
if (pozice < text.length())
cout << "Nalezeno na pozici " << pozice << endl;
else
cout << "Nenalezeno" << endl;
cin.get();
{/CPP_CONSOLE}
Asi vás nepřekvapí, že se pozice indexuje od nuly.
Konzolová aplikace
Nalezeno na pozici 9
Dále string poskytuje sadu obdobných metod, pouze s jinou funkcionalitou:
rfind()
: najde poslední výskytfind_first_of()
: najde první výskyt libovolného znaku z parametrufind_last_of()
: najde poslední výskyt libovolného znaku z parametrusubstr()
: vrátí podřetězec, určený počátkem a délkou
Porovnání řetězců
Porovná 2 řetězce podle abecedy. Můžeme využít porovnávací operace
jako větší (>
) a menší (<
).
{CPP_CONSOLE}
string prvni = "Hello";
string druhy = "World";
bool porovnani= prvni < druhy;
cout << porovnani;
{/CPP_CONSOLE}
Metody pro práci s řetězci je mnohem více. Podrobně se s nimi seznámíme v jednom z dalších článků.
Další interpretace řetězců
C++ poskytuje i podporu pro nízkoúrovňový přístup k řetězcům, tedy
umožňuje je kromě objektů string
definovat i jen jako
obyčejná pole typu char
. Typ string
je v C++ pouze
obal, který vnitřně používá právě tento nízkoúrovňový přístup.
Budete-li pracovat s knihovnami pro C nebo budete-li volat systémová volání,
budete nuceni použít jen pole typu char
. Tato interpretace je
používaná v C (protože C string
nemá), a tak vás přesměruji
na díl o textových řetězcích v C. Základní popis můžete nalézt v lekci
Textové
řetězce, téma je dále rozšířeno v lekci Textové
řetězce podruhé.
Pro dnešek by to bylo vše.
V příští lekci, Textové řetězce v jazyce C++ podruhé - Práce se znaky, se budeme věnovat dále textovým řetězcům a to na několika praktických programech.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 82x (15.91 kB)
Aplikace je včetně zdrojových kódů v jazyce C++