2.9.1 Merkkijonojen esittely ja alustaminen

Merkkijono on erikoistapaus taulukosta. Pääsääntöisesti voidaan sanoa, että kaikki, mitä edellä on mainittu taulukosta, pätee merkkijonolle. Merkkijono on kuitenkin käsittelynsä puolesta erikoisasemassa, joten käänteinen väite ei pidä paikkaansa; kaikki, mikä pätee merkkijonolle ei päde taulukoille yleisesti.

Merkkijono esitellään kuten taulukot yleensä, mutta tyyppinä on aina char:

char nimi[pituus];

Esimerkiksi

char paikkakunta[80];

määrittelee merkkijonomuuttujan paikkakunta, jonka pituudeksi tulee 80 merkkiä.

Merkkijonomuuttujaan tallennettavan merkkijonon pituuden ei tarvitse olla sama kuin varatun tilan pituus (joka on siis maksimipituus), vaan esimerkiksi 80 merkin muuttujaan voidaan hyvin tallentaa vaikkapa jono "kukkuu". Tällöin on tietysti jotenkin tiedettävä, mihin varsinainen merkkijono päättyy. Tähän tarkoitukseen eli merkkijonojen loppumerkiksi on varattu nollatavu (tavu, jonka arvo on 0). Loppumerkki voidaan merkkinä esittää muodossa '\0'.

Merkkijono voidaan alustaa esittelynsä yhteydessä niin kuin mikä tahansa muukin taulukko:

char paikkakunta[80] = "Jyväskylä";

Tässä vakiomerkkijonolle varattu merkintä "Jyväskylä" on lyhenne ja tarkoittaa itse asiassa kymmentä merkkityypin char alkiota 'J', 'y', ... , 'ä' ja '\0'. Siten eo. alustus voitaisiin tehdä myös merkki kerrallaan:

char paikkakunta[80] = {'J','y','v','ä','s','k','y','l','ä','\0'};

Huomaa, että vakiomerkkijonoa käytettäessä loppumerkkiä ei kirjoiteta näkyviin, vaan kääntäjä lisää sen automaattisesti. Sen sijaan merkki kerrallaan alustettaessa pitää loppumerkki lisätä itse.

Kuten muutoinkin, taulukon kokoa ei tarvitse erikseen ilmoittaa, mikäli se määräytyy alustuksen perusteella:

char paikkakunta[] = "Jyväskylä"; // char paikkakunta[10];

Huomaa, että vaikka jonossa "Jyväskylä" on vain 9 merkkiä, niin varaus tehdään 10 merkille! Merkkijonon pituus siis ilmoittaa, monelleko merkille muistista on varattu tilaa, loppumerkki mukaanlukien.

Vielä pari esimerkkiä:

char viesti[20] = "heipä hei";
char paikkakunta[] = "Jyväskylä";

Alustettava merkkijono sijoitetaan merkki merkiltä esitellyn merkkijonon arvoksi. Edellä molemmat alustusjonot sisältävät 10 merkkiä (9 merkkiä + loppumerkki), mutta jonoille varataan erilaiset muistialueet.

Mitkä ovat merkkijonojen varaamat alueet ja sisällöt seuraavien määrittelyjen jälkeen?
char jono[99];
char nimi[] = "Jukka";
char suku[20] = "Virtala";