'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"; // 4Jos 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