'a').
Merkkijono (string) on jono peräkkäin
olevia merkkejä ja vastaa tekstiä.
Merkkijonon merkit kirjoitetaan lainausmerkkien sisään
(esimerkiksi "apina").
char on
yleensä 8-bittinen tyyppi,
joka vastaa yhtä merkkiä.
Esimerkiksi seuraava ohjelma määrittelee
merkkimuuttujan ja tulostaa sen:
char x = 'a'; cout << x << "\n"; // aJokaisella merkillä on kaksi luonnetta: merkkiesitys ja merkkikoodi. Merkkiesitys tarkoittaa, miltä merkki näyttää, ja merkkikoodi on merkkiä vastaava kokonaisluku.
Merkin merkkikoodin voi tulostaa muuttamalla
tyypiksi int.
Esimerkiksi merkin 'a' koodi on 97,
minkä voi havaita seuraavasti:
cout << (int)'a' << "\n"; // 97Vastaavasti merkkikoodia vastaavan merkin voi tulostaa muuttamalla tyypiksi
char:
cout << (char)97 << "\n"; // aMerkkiesitys on itse asiassa vaihtoehtoinen tapa antaa kokonaisluku koodissa. Erona on, että
char-arvosta
tulostetaan merkkiesitys ja
int-arvosta tulostetaan merkkikoodi.
Seuraava koodi havainnollistaa asiaa:
int x = 'a'-5; cout << x << "\n"; // 92Koodissa
'a' tarkoittaa lukua 97,
joten muuttujan x arvoksi tulee 97–5 = 92.
| 32 | 0 | 48 | @ | 64 | P | 80 | ` | 96 | p | 112 | ||||||
| ! | 33 | 1 | 49 | A | 65 | Q | 81 | a | 97 | q | 113 | |||||
| " | 34 | 2 | 50 | B | 66 | R | 82 | b | 98 | r | 114 | |||||
| # | 35 | 3 | 51 | C | 67 | S | 83 | c | 99 | s | 115 | |||||
| $ | 36 | 4 | 52 | D | 68 | T | 84 | d | 100 | t | 116 | |||||
| % | 37 | 5 | 53 | E | 69 | U | 85 | e | 101 | u | 117 | |||||
| & | 38 | 6 | 54 | F | 70 | V | 86 | f | 102 | v | 118 | |||||
| ' | 39 | 7 | 55 | G | 71 | W | 87 | g | 103 | w | 119 | |||||
| ( | 40 | 8 | 56 | H | 72 | X | 88 | h | 104 | x | 120 | |||||
| ) | 41 | 9 | 57 | I | 73 | Y | 89 | i | 105 | y | 121 | |||||
| * | 42 | : | 58 | J | 74 | Z | 90 | j | 106 | z | 122 | |||||
| + | 43 | ; | 59 | K | 75 | [ | 91 | k | 107 | { | 123 | |||||
| , | 44 | < | 60 | L | 76 | \ | 92 | l | 108 | | | 124 | |||||
| - | 45 | = | 61 | M | 77 | ] | 93 | m | 109 | } | 125 | |||||
| . | 46 | > | 62 | N | 78 | ^ | 94 | n | 110 | ~ | 126 | |||||
| / | 47 | ? | 63 | O | 79 | _ | 95 | o | 111 |
'\n', jonka koodi on 10.
Kätevä ominaisuus ASCII-merkistössä on, että numerot 0–9 ovat peräkkäin, samoin kirjaimet a–z ja A–Z. Tämän ansiosta voi tehdä vaikkapa seuraavan koodin:
for (char x = 'a'; x <= 'z'; x++) {
cout << x;
}
cout << "\n";
Koodin tulostus on seuraava:
abcdefghijklmnopqrstuvwxyz
string.
Seuraava koodi luo ja tulostaa merkkijonon:
string s = "apina"; cout << s << "\n"; // apinaVoimme myös luoda merkkijonon antamalla pituuden ja toistettavan merkin:
string s(5,'a'); cout << s << "\n"; // aaaaaMerkkijonoja voi yhdistää toisiinsa
+-operaattorin
avulla:
string a = "esi"; string b = "merkki"; cout << a+b << "\n"; // esimerkkiFunktio
size antaa merkkien määrän:
string s = "apina"; cout << s.size() << "\n"; // 5
[]-merkinnällä.
string s = "apina"; cout << s[0] << "\n"; // a cout << s[1] << "\n"; // pMerkkijonon sisältöä voi myös muuttaa:
string s = "apina"; s[3] = 'l'; cout << s << "\n"; // apilaSeuraava koodi käy puolestaan läpi merkkijonon merkit ja tulostaa niiden koodit:
string s = "apina";
for (int i = 0; i < s.size(); i++) {
cout << i << " " << s[i] << " " << (int)s[i] << "\n";
}
Koodin tulostus on seuraava:
0 a 97 1 p 112 2 i 105 3 n 110 4 a 97
substr(k) erottaa merkkijonon
loppuosan kohdasta k alkaen.
Funktio substr(k,p) puolestaan erottaa
p merkkiä kohdasta k alkaen.
Jos merkkijono loppuu kesken, merkkejä tulee vähemmän.
string s = "cembalo"; cout << s.substr(2) << "\n"; // mbalo cout << s.substr(2,3) << "\n"; // mba cout << s.substr(2,10) << "\n"; // mbaloFunktio
find(x) etsii ensimmäisen kohdan,
josta alkaa osajono x.
Funktio find(x,k) etsii puolestaan
ensimmäisen tällaisen kohdan, joka on k tai suurempi.
string s = "banaani";
cout << s.find("naa") << "\n"; // 2
cout << s.find("an") << "\n"; // 1
cout << s.find("an",2) << "\n"; // 4
Jos haettua kohtaa ei ole, funktio palauttaa arvon
npos, joka vastaa lukua -1.
string s = "banaani";
if (s.find("ap") == -1) {
// ei löytynyt
}
to_string muuttaa luvun merkkijonoksi:
int x = 123; string s = to_string(x);Toiseen suuntaan muunnoksessa funktion nimi riippuu halutusta lukutyypistä. Esimerkiksi funktiot
stoi ja stod
muuttavat merkkijonon sisällön
int- ja double-arvoksi.
string s = "123"; int a = stoi(s); double b = stod(s);
Vaikeutena on, että näiden merkkien sisäiseen esittämiseen on monia eri tapoja ja asia riippuu järjestelmästä. Nykyään yleinen tapa on UTF-8, jossa ASCII-merkistön ulkopuoliset merkit muodostuvat sisäisesti useammasta merkistä. Seuraava koodi havainnollistaa asiaa:
string s = "pöllö";
cout << s << "\n";
cout << s.size() << "\n";
for (int i = 0; i < s.size(); i++) {
cout << i << " " << s[i] << " " << (int)s[i] << "\n";
}
Koska merkki ö ei kuulu ASCII-merkistöön,
se tallennetaan kahtena merkkinä,
minkä vuoksi merkkijonon pituus on 7 eikä 5.
Jos merkkejä koettaa tulostaa, ö:n sijasta tulee
kaksi erikoismerkkiä, joita ei voi tulostaa.
pöllö 7 0 p 112 1 � -61 2 � -74 3 l 108 4 l 108 5 � -61 6 � -74