Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.
Problem jest z funkcją get(). Ta funkcja
odczytuje znak końca linii, ale go nie odrzuca, znak pozostaje w buforze. Aby
zaradzić naszemu problemowi korzystamy z funkcji ignore(). Ta funkcja
przyjmuje dwa parametry: pierwszy określa maksymalną ilość znaków do
pominięcia, drugi określa znak końcowy. W naszym zapisie funkcja ignore()
odrzuci do 255 znaków oraz znajduje znak końca łańcucha \0 i też go odrzuca.
Tego typu niedogodności w obsłudze napisów w stylu języka C mamy wiele.
Kolejny przykład ilustruje problemy związane ze stosowaniem funkcji
operujących na napisach.
Wydruk 7.3. Przykład użycia cin.getlin(), strcpy(), strcat()
#include<iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
using namespace std;
int main()
{
char text[200];
char s1[80];
char s2[80];
cout << "wpisz tekst: ";
cin.getline(s1,79);
cout << "wpisz tekst: ";
cin.getline(s2,79) ;
strcpy(text,"\n ");
strcat(text,s1);
strcat(text,s2);
cout << text << endl;
getche();
return 0;
}
Wynikiem działania programu jest komunikat:
wpisz tekst: to jest
wpisz tekst: programowanie
to jest programowanie
192
7. Łańcuchy i klasa string
Jeżeli w programie nie będzie instrukcji:
strcpy(text,"\n ");
to otrzymamy wynik:
wpisz tekst: to jest
wpisz tekst: programowanie
debugHoo@to jest programowanie
Ewidentnie, ponownie wystąpił problem z obsługą napisów. W naszym
programie wprowadzamy napisy z klawiatury ( tablice s1 i s2) a następnie przy
pomocy funkcji strcat() łączymy te dwa napisy. Pierwsza wywoływana w tym
celu jest funkcja strcpy(), która kopiuje stałą tekstową na początek zmiennej
tekst. Gdybyśmy, jako pierwszą wywołali funkcje strcat(), wystąpiłby problem
(zależny od typu kompilatora). Umieszony w tej zmiennej znak przejścia do
nowej linii \n rozwiązuje problem.
Takich problemów, jaki tu zasygnalizowaliśmy jest znacznie więcej.
Opracowanie nowej koncepcji obsługi napisów w języku C++, jakim było
wprowadzenie klasy string, zdecydowanie uprościło programowanie z udziałem
łańcuchów znakowych.
7.3. Łańcuchy w stylu języka C++
Twórcy języka C++ zdając sobie sprawę z niedoskonałości obsługi tablic
znakowych w języku C, zaproponowali nową koncepcję przetwarzania
łańcuchów – stworzona została nowa klasa, klasa o nazwie string. Pamiętamy,
że klasa jest typem zdefiniowanym w programie lub bibliotece, co oznacza, że
praktycznie dysponujemy nowym typem, typem string. Oczywiście w
programie możemy wprowadzać i wykonywać żądane operacje na łańcuchach w
stylu C a także na łańcuchach w stylu C++. W celu programowania z użyciem
łańcuchów w stylu C++ należy włączyć plik nagłówkowy <string>. Plik
nagłówkowy o nazwie <string.h> umożliwia przetwarzanie łańcuchów „starego
typu”, to znaczy łańcuchów w stylu C.
Zmienne typu string można deklarować w zwykły sposób:
string a,b;
Jest to deklaracje dwóch zmiennych typu string. Gdy już zostały utworzone
zmienne typu string należy je zainicjalizować. Można to zrobić na kilka
sposobów:
string a,b;
a = ”to jest”;
b = ”programowanie;
Wprowadzenie do STL
193
Można połączyć deklarację z inicjalizacją:
string a = ”to jest”
Ponieważ mamy do czynienia z klasą, obiekt string można inicjalizować
konstruktorem:
string a ( ”to jest”);
Klasa string ma wiele metod i przeciążonych operatorów, co pozwala na
stosunkowo łatwe manipulowanie napisami w stylu języka C++. Podstawowe
operacje wykonywane na napisach ilustruje kolejny program.
Wydruk 7.4. Łańcuchy w stylu języka C++
#include<iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{ string s1 ( " - to jest ");