Znaky

V C++ okrem čísel vieme pracovať aj so znakmi. Znaky píšeme medzi jednoité úvodzovky, napríklad 'a' 'z' 'F' '7' '.' '#' '-'... Niektoré znaky treba písať pomocou \, ako sme si už spomínali, napríklad '\n' alebo '\''.

Čo sa týka premenných, najlepšie je používať typ char, ktorý je v skutočnosti číselná premenná s rozsahom -128 až 127. Každé z týchto čísel má priradený nejaký znak podľa ASCII.

Napríklad $64$ je 'A', ale takéto veci si nemusíme pamätať, lebo so znakmi sa dajú robiť matematické operácie ako s číslami. Napríklad 'a'+1 == 'b'.

Ak chceme znak vypísať ako znak, tak použijeme značku %c.

Cvičenie: Skúste si spustiť nasledovné programy a porovnajte ich správanie:

#include <cstdio>

int main() {
    char a;
    scanf("%c", &a);
    printf("<%c>\n", a);
}
#include <iostream>

using namespace std;

int main() {
    char a;
    cin >> a;
    cout << "<" << a << ">" << endl;
}
Riešenie Prvý program načítava všetky riadky, teda aj biele znaky (medzery, tabulátory, konce riadkov). Druhý program biele znaky preskakuje. V prípade, že by sme v prvom programe napísali miesto `scanf("%c", &a);` `scanf(" %c", &a);` mal by sa správať rovnako ako druhý.

Pole znakov, teda char meno[], môžeme nazývať reťazec. Napríklad "jesko" je reťazec a zároveň je to pole {'j', 'e', 's', 'k', 'o', '\0'}. '\0' je znak s hodnotou 0 a v C++ sa ním ukončujú všetky reťazce.

Všetky funkcie, ktoré robia niečo s reťazcami, končia čítanie reťazca na nulových znakoch. Preto aj príkaz printf("a\0hoj"); vypíše len "a".

Jeden zo spôsobov ako vyrábať nami definované reťazce je napr. char retazec[] = "lubovolny text";

Cvičenie: Ako jedným príkazom skrátime reťazec char str[] = "dlhy retazec"; na dĺžku 3?

Riešenie `str[3] = 0;` alebo `str[3] = '\0';`.

Načítavať a vypisovať reťazce vieme pomocou značky %s s tým rozdielom, že pri načítavaní nepíšeme &.

#include <cstdio>

int main() {
    char a[100];
    scanf("%s", a);
    printf("<%s>\n", a);
}
#include <iostream>

using namespace std;

int main() {
    char a[100];
    cin >> a;
    cout << "<" << a << ">" << endl;
}

Ako si iste všimneme po spustení programov, reťazce sa načítavajú "po slovách", vždy len po najbližší biely znak (medzera, koniec riadku, tabulátor).

Pri reťazcoch (ale aj iných poliach) a operátoroch si treba dávať pozor. Keď A a B sú polia, tak A<B nevráti true v prípade, že A obsahuje menšie čísla. Rovnako aj A == B netestuje, či polia obsahujú rovnaké čísla. Ani A + B nesčíta obsahy polí ani A = B neprekopíruje čísla z jedného do druhého. Jednoducho operátory robia s poľami celkom odlišné veci.

Je to spôsobené tým, že hodnota premenných A a B sú smerníky do pamäte a operátory pracujú len s týmito smerníkmi.