Prev Next Up Title Contents Index

Merkkijonoluokka string


Koska merkkijonojen käsittely on eräs C- kielen heikkouksista, olisi toivottavaa että luokkakirjastoista löytyisi jokin string-luokka.

BC 5.0:n mukana tulee ANSI - yhteensopivaksi mainostettu luokka (??), jossa on mm. seuraavat ominaisuudet:

cpp\ansicpp\stringt2.cpp - testataan std:n string-luokkaa

	// stringt2.cpp  - testataan std:n string-luokkaa
	#include <iostream.h>
	#include <string>
	#include <stdio.h>   // vain printf-testejä varten
	using namespace std;
	
	#define T(s) cout << #s" = |" << s << "|\n" /* T(s3) => s3 = |kissa|        */
	
	int main(void)
	{
	try {
	  string s1("Kissa"),s2("istuu"),s3,vert;
	
	  if ( s1 < s2 ) vert = " < " ; else vert = " >= ";
	  int eq = s1.compare(s2);
	  cout << s1 << vert << s2 << " : "<< eq << '\n';// => Kissa < istuu : -30
	
	  s3 = s1 + " " + s2;                T(s3); // => |Kissa istuu|
	  s3 += " puussa";                   T(s3); // => |Kissa istuu puussa|
	
	  cout << "Anna jono>"; cin >> s3;          // Jos kirjoitetaan Aku Ankka
	  T(s3);                                    // tulostuu nyt Aku ja loput jää!
	  cout << "Anna jono>"; getline(cin,s3,'\n');// Jos kirjoitetaan Aku Ankka
	  T(s3);                                    // tulostuu nyt Aku Ankka
	
	  char c = s1[2];                    T(c);  // => |s|
	  int len = s1.length();             T(len);// => |5|
	  s3 = 'A';                          T(s3); // => |A|
	  s3 = "0123456";
	  s3.append("ABCDEF",2,2);           T(s3); // => |0123456CD|
	  int paikka = s3.find("34");    T(paikka); // => |3|
	  s2 = s3.substr(2,3);               T(s2); // => |234|
	  s3.replace(5,3,"ABCDEF");          T(s3); // => |01234ABCDEFD|
	  s3.remove(5,6);                    T(s3); // => |01234D|
	  s3.insert(5,"56C");                T(s3); // => |0123456CD|
	  s3[2] = 'C';                       T(s3); // => |01C3456CD|
	  s2 = s3.substr(2,3);               T(s2); // => |C34|
	  printf("s2 = |%s|\n",s2.c_str() );        // => |C34|
	  char s4[10];
	  strcpy(s4,s2.c_str());             T(s4); // => |C34|
	  s3.copy(s4,2);                     T(s4); // => |014|
	  s1 = "   Kissa   istuu   ";
	// Seuraavat toimivat BC:n cstrinh.h:ssa olevassa string-luokassa
	//  s2 = s3("C.*5");                   T(s2); // => |C345| C, mitä tahansa, 5
	//  s3 = s1.strip(s1.Both,' ');        T(s3); // => |Kissa   istuu|
	//  s1.to_upper();                     T(s1); // => |   KISSA   ISTUU   |
	  c = s2[12];                          T(c);  // Tulee throw(out_of_range)
	}
	catch ( out_of_range ) { cout << "Liian iso indeksi\n"; }
	  return 0;
	}
	
Borland C++ 5.0:ssa on myös oma string- luokka tiedostossa cstring.h. Se on melkein yhteensopiva standardiehdotuksen kanssa. Valitettavasti edellinen esimerkki ei toimi samalla tavalla inputin kohdalta. Toisaalta cstring.h:ssa on paljon hyödyllisiä lisäominaisuuksia, joita standardista puuttuu. Kunpa standardienkin tekijät joskus tekisivät itse oikean ohjelman! Erityisesti jää kaipaamaan välilyöntien siivoamista ja vertailua, jossa isot ja pienet kirjaimet samaistetaan.

Voisi kuvitella, että myös seuraavat ominaisuudet olisivat hyödyllisiä:

cpp\ansicpp\istrtes2.cpp - merkkijonotoiveiden testaus

	  string s1("3"),s2("7"),s3;
	  s3 = s2+"-4";                      T(s3); // => |3|
	  s3 = 'A';                          T(s3); // => |A|
	  s3 = s1+5;                         T(s3); // => |8|
	  s3 = 5+s1;                         T(s3); // => |8|
	  s3 = s1+s2;                        T(s3); // => |10|
	  s3 = "4"+s2;                       T(s3); // => |11|
	  s3 = s2+"4";                       T(s3); // => |11|
	  s3 = string("56")+"7";             T(s3); // => |63|
	  s3 = "K"+s1;                       T(s3); // => |K3|
	  s3 = s1+'5';                       T(s3); // => |8|
	  s3 = s1+'A';                       T(s3); // => |3A|
	//  char ch = s1;                      T(ch); // => |3|
	//  s3 = 5;                            T(s3); // => |5|
	//int i = s3;                        T(i);  // => |5|

Tehtävä 1.1 string- luokan muuttaminen

Mitä tarvitsee tehdä, jotta edellä mainitut toiveet saataisiin toteutettua string-luokalle. Entä jos halutaan tehdä luokka jossa kommenteiksi laitetut sijoituksetkin ovat mahdollisia.


Prev Next Up Title Contents Index