Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

9.8.1 Merkkijonot

Jos kerrankin pääsisin vastakkain nykykielten kehittäjien kanssa, niin tekisi kovasti mieli kysyä ovatko he koskaan tehneet oikeaa ohjelmaa. Nimittäin lähes kielestä riippumatta kunnolliset merkkijonot loistavat poissaolollaan. Ja ohjelmoijat ovat käyttäneet äärettömästi työtunteja tehdessään itselleen aluksi edes auttavaa merkkijonokirjastoa. Ainoastaan "lelukielissä" - Basicissä ja Turbo Pascalissa on ollut hyvät ja turvalliset merkkijonot.

C-kielen char jono[10] on todellinen aikapommi, jonka aukkoisuuteen perustuu vielä tänäkin päivänä useat hakkereiden kikat murtautua vieraisiin tietojärjestelmiin. Katsotaanpa ensin mitä C-merkkijonoille voi/ei voi tehdä:

	char s1[10],s2[5],*p; 	:-(
	p = "Kana"           // Toimii!
	p[0] = 'S';          // Toimii! Mutta jatkossa käy huonosti...  
	s1 = "Kissa";        // ei toimi!
	strcpy(s2,"Koira");  // Huonosti käy!  Miksi?  Älä käytä koskaan...
	if ( s1 < s2 ) ...   // Sallittu, mutta tekee eri asian kuin lukija arvaakaan...
	gets(s1);            // Itsemurha, tämä on eräs kaikkein hirveimmistä funktioista
	                     // lukee päätteeltä rajattomasti merkkejä ...
	fgets(s1,sizeof(s1),stdin);  // Oikein!  Tosin rivinvaihto jää jonoon jos syöte
	                             // on lyhyempi kuin 9 merkkiä
	printf(s1);          // Ohohoh!   Tämä jopa toimii!!!
	cout << s1;          // Ja jopa tämäkin!!!
	cin >> s1;           // Taas itsemurha ....

Jos käytetään C-kieltä, pitää käyttää varsin paljon aikaa siihen miten C:n merkkijonoja voidaan kohtuullisen turvallisesti käyttää.

Onneksi C++:assa on kohtuullinen merkkijonoluokka. Nyt jo! Yli 10 vuotta kielen kehittämisen jälkeen...

Katso esimerkiksi: http://www.iki.fi/gaia/tekstit/cxxstring/

Javassa on vastaavasti kaksi merkkijonoluokkaa: String ja StringBuffer. Ensin mainittu koskee merkkijonoja, joita ei koskaan ( immutable) tarvitse muuttaa, vaan riittää aina luoda uusi merkkijono. Jälkimmäistä käytetään, mikäli jonoon tulee paljon muutoksia ( mutable).

Tehtävä 9.20 Ensimmäinen melkein järkevä olio

Täydennä seuraavat luokat ja testaa ohjelma.

olioalk\Henkilo.java - 1. järkevä olio

	/**
	 * Henkilöluokka
	 * Täydennä luokka.
	 * @author  Vesa Lappalainen
	 * @version 1.0, 05.02.2003
	 */
	public class Henkilo {
	
	  private String nimi;
	  private int ika;
	  private double pituus_m;
	
	  Henkilo(String nimi, int ika, double pituus_m) {
	
	  }
	
	  public String toString() {
	    return "";
	  }
	
	  public void kasvata(double cm) {
	
	  }
	
	  public static void main(String[] args) {
	
	  }
	
	}

olioalk\Opiskelija.java - 1. järkevä olio

	/**
	 * Opiskelija, joka on peritty henkilöstä
	 * @author  Vesa Lappalainen
	 * @version 1.0, 05.02.2003
	 */
	public class Opiskelija extends Henkilo {
	  double keskiarvo;
	
	  Opiskelija(String nimi, int ika, double pituus_m, double keskiarvo) {
	     super(nimi,ika,pituus_m);
	  }
	
	  public String toString() {
	    return "";
	  }
	
	  public static void main(String[] args) {
	    Henkilo Kalle = new Henkilo("Kalle",35,1.75);
	    System.out.println(Kalle);
	    Kalle.kasvata(2.3);
	    System.out.println(Kalle);
	    Opiskelija Ville = new Opiskelija("Ville",21,1.80,9.9);
	    System.out.println(Ville);
	  }
	
	}


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys