10. díl - Řetězce v jazyce C++

C++ Základní konstrukce C++ Řetězce v jazyce C++

Až doposud jsme se v našem seriálu úspěšně vyhýbali textovým řetězcům a pracovali jsme pouze s čísly a znaky. V naprosté většině reálných aplikací ovšem figurují víceznakové texty. Těm se v programování říká textové řetězce (jelikož se jedná o řetěz znaků) nebo někdy jen řetězce.

Knihovna string

S řetězci lze v C++ pracovat několika způsoby. My si v tomto dílu uvedeme zatím ten nejjednodušší, tzv. statický řetězec, kterým je typ string. Když budeme chtít uložit do proměnné textový řetězec "itnetwork", pouze vytvoříme objekt typu string a přiřadíme mu řetězec. Zatím vás nemusí trápit, že vlastně nevíte, 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 stiknutí klávesy od uživatele.

Hello world C++

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, které typ string poskytuje. My si na konci uvedeme ty základní. Můžeme například změnit první znak a mezi každým písmenem vypsat mezeru:

string pozdrav = "Hello World!";
pozdrav[0] = 'h';
for( int a = 0; a < 12; a++ )
        cout << pozdrav[a] << ' ';
cout << endl;
cin.get();
return 0;

Výsledek:

Práce s řetězcem jako s polem

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é odděleny 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 následně vás pozdraví:

string jmeno;
cout << "Zadejte vase jmeno: ";
cin >> jmeno;
cout << "Zdravim " << jmeno << endl;
cin.ignore(0xFF,'\n');
cin.get();

Výsledek nás možná překvapí:

Pozdrav v C++

Všimněme si, že bylo přeč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 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á má ignorovat, a to až po znak '\n', který určuje enter. Pokud bychom tuto metodu nezavolali, cin.get() by autmaticky 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 textu uloží.

cout << "Zadejte vase jmeno: ";
getline( cin, jmeno );
cout << "Zdravim " << jmeno << endl;
cin.get();

Standardní funkce pro práci s řetězci

Typ string nám poskytuje mnoho připravených funkcí pro práci s řětězci, které zjednoduší naše programy.

length (délka řetězce)

Délku řetězce můžeme zjistit pomocí metody length (podrobnější popis je opět součástí série o OOP).

string pozdrav = "Hello World";
int delka = pozdrav.length();

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í.

string prvniPozdrav = "Hello ";
string druhyPozdrav = "World";
string pozdrav = prvniPozdrav + druhyPozdrav;
pozdrav.clear();

find (hledá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 velikost řetězce.

string text = "Pan X znovu udeřil.";
int pozice = text.find( "ovu" );
if( pozice < text.length() )
        cout << "Nalezeno na pozici " << pozice << endl;
else
        cout << "Nenalezeno" << endl;
cin.get();

Asi vás nepřekvapí, že se pozice indexuje od nuly.

Hledání v řetězci v C++

Dále string poskytuje sadu obdobných metod, pouze s jinou funkcionalitou:

  • rfind: najde poslední výskyt
  • find_first_of: najde první výskyt libovolného znaku z parametru
  • find_last_of: najde poslední výskyt libovolného znaky z parametru
  • substr: 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ší (<).

string prvni = "Hello";
string druhy = "World";
bool porovnani= prvni < druhy;

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. 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 knihovnama pro C nebo budete-li volat systémové volání, budete nuceni použít tuto interpretaci. 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 díle Textové řetězce, téma je dále rozšířeno v díe Textové řetězce podruhé.

Pro dnešek by to bylo vše. Příště se podíváme na vícerozměrné pole.


 

Stáhnout

Staženo 3x (15.91 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

  Aktivity (4)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Cvičení k 8.-9. lekci C++
Miniatura
Všechny články v sekci
Základy C++
Miniatura
Následující článek
Cvičení k 10. lekci C++

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!