Zmienne - Typ znakowy i typ napisowy - typy napisowe w C++

Przedstawiłem Ci już podstawowe typy liczbowe. Jak już się domyślasz i podejrzewasz, operując tylko na liczbach nie byłoby nam zbyt wygodnie komunikować się z użytkownikiem. Tak naprawdę te dwa typy które Ci teraz przedstawię, służą głównie do komunikacji z użytkownikiem, ale nie tylko.


Typ znakowy

Typ znakowy umożliwia przechowywanie jednego znaku. Do czego taki typ może nam się przydać? Przede wszystkim umożliwia on potwierdzanie pewnych akcji. Nie raz pewnie udało Ci się natknąć na program, który żądał potwierdzenia jakiejś akcji. Tutaj właśnie poprzez podanie odpowiedniej litery, cyfry lub innego znaku, można właśnie zrealizować.


Typ znakowy w języku C++ to:

char - typ znakowy (zajmuje 1 bajt)

Jeśli dokładnie czytasz, powinno zwrócić Twoją uwagę stwierdzenie, że możemy podać jak znak, zarówno literę, cyfrą jak i inny znak. Może Cię to zastanawiać, ale przecież czy cyfry nie można traktować jako znaku? Oprócz tego możemy wykorzystywać w programach również takie, znaki których nie można wpisać za pomocą klawiatury.


Poniżej przedstawiam przykładowy program, w którym pobieramy znak z klawiatury, wypisujemy później pobrany znak. Dodatkowy wypiszemy rozmiar typu char. Podany znak musi być znakiem niesterującym, czyli nie może to być znak typu Ctrl, Shift, Alt, F1 itd. Możesz wpisać tylko jeden znak - inaczej program nie zadziała "poprawnie".

#include <iostream>

using namespace std;

int main()
{
  char znak; // typ znakowy
 
  cout <<"Podaj dowolny NIESTERUJACY znak z klawiatury: ";
  cin >>znak;
  cin.ignore();
 
  cout <<endl<<"Znak podany przez Ciebie to: "<<znak<<"."<<endl;
  cout <<"Typ char zajmuje "<<sizeof(char)<<" bajt."<<endl;
  cout <<"Zmienna zajmuje "<<sizeof(znak)<<" bajt."<<endl<<endl;
 
  cout <<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 6.1

Znaki zapisujemy w pojedynczych cudzysłowach '. Np. poniższa instrukcja spowoduje wypisanie litery a, spacji, a następnie litery b.

cout <<'a'<<' '<<'b';


Bardzo ważne jest, aby w takim przypadku pomiędzy cudzysłowami znajdował się tylko jeden znak. W innym przypadku kompilator zazwyczaj wypisze błąd. Może się jednak zdarzyć, że kompilator nie zasygnalizuje błędu, program się skompiluje a wskutek błędnego zapisu, program nie będzie działał poprawnie.


Oprócz standardowego zapisu możemy również wypisywać znaki za pomocą sekwencji '\ooo', przy czym ciąg ooo to liczba w zapisie ósemkowym. Poniższa linijka przedstawia sposób wypisania litery S tą metodą. Jak widzisz nie jest to zbyt wygodna i tak naprawdę zbyt przydatna metoda.

cout <<'\123';


Znacznie bardziej przydatna jest możliwość wypisywania znaków specjalnych. Wszystkie znaki specjalne są poprzedzone znakiem \. Jak już wiesz, alternatywnym sposobem przechodzenia do nowej linii podczas wyświetlania komunikatów jest właśnie znak specjalny '\n' - znak nowej linii. My w naszych programach stosujemy modyfikator endl, który pojawił się w języku C++.

Oto pełna lista znaków specjalnych w języku C++:


'\n'  - nowa linia
'\t'   - tabulacja pozioma (czyli "normalny" tabulator)
'\v'  - tabulacja pionowa
'\b'  - cofnięcie (skasowanie ostatniego znaku)
'\r'   - powrót karetki (przesunięcie do początku wiersza)
'\f'   - nowa strona
'\a'  - sygnał dźwiękowy
'\\'  - ukośnik (backslash), czyli znak \
'\?'  - znak zapytania
'\''   - pojedynczy cudzysłów
'\"'  - podwójny cudzysłów


Zapamiętanie tej listy znaków nie jest takie trudne. Na dodatek, większości z tych znaków nie będziesz używać zbyt często. Tak naprawdę najczęściej będziesz używać znaku nowej linii i cudzysłowów.

Typ napisowy

Mimo, że sam typ znakowy jest przydatny, to ma on jedno ograniczenie: za jednym razem można pobrać/wypisać tylko jeden znak. W przypadku gdy chcemy wypisać kilka liter, posługiwanie się typem znakowym nie jest zbyt wygodne.


Typem napisowym w języku C++ jest:

string - typ napisowy


Bardzo ważne jest pamiętanie o tym, że aby korzystać z typu napisowego, musimy dołączyć plik nagłówkowy cstring. Przy okazji warto zaznaczyć, że w języku C, czyli w poprzedniku języka C++, do przechowywania napisów stosowało się zazwyczaj tablice znaków.


Poniżej przedstawiam przykładowy program, w którym pobieramy napis z klawiatury, a następnie wypisujemy pobrany napis. Napis musi się składać ze znaków niesterujących, czyli nie może to być znaków typu Ctrl, Shift, Alt, F1 itd. Dodatkowo, proszę nie stosować białych znaków (tzn. spacji czy znaków tabulacji), bowiem wtedy program nie zadziała "poprawnie".


#include <iostream>
#include <cstring>

using namespace std;

int main()
{
  string napis; // typ napisowy  
  cout <<"Podaj napis (bez bialych znakow) z klawiatury: ";
  cin >>napis;
  cin.ignore();
 
  cout <<endl<<"Napis podany przez Ciebie to: "<<napis<<"."<<endl<<endl;
 
  cout <<"Nacisnij ENTER aby zakonczyc"<<endl;
  getchar();
  return 0;
}
program nr 6.2

Jeśli przyjrzysz się powyższemu programowi, zauważysz coś jeszcze. Zauważ, że wszystkie napisy, które wypisujemy na ekran są wypisywane w podwójnych cudzysłowach ".


Dzięki stosowaniu napisów, możemy znacznie przyspieszyć wypisywanie komunikatów na ekran. Na przykład dwa poniższe fragmenty kodu w C++ są sobie równoważne:

cout <<'a'<<' '<<'b';

cout <<"a b";


Ponadto w napisach możemy również stosować bez problemu wszystkie znaki specjalne (przedstawione przy omawianiu typu znakowego). Dzięki temu również zaoszczędzimy pisania.


Typ napisowy a pobieranie danych

Mam nadzieję, że Twoją uwagę zwróciło to, że w przykładowym programie nie wolno Ci było podawać w napisie żadnych białych znaków, np. spacji. Z kolei jak widzisz napisy wypisywane na ekran zawierają spacje.


Prawda jest taka, że napisy i zmienne typu string mogą bez problemu zawierać różne znaki, w tym również spacje, tabulatory itd. Problemem jest sposób pobierania napisu z klawiatury. Standardowo dane z klawiatury są pobierane do pierwszego białego znaku (czyli znaków takich jak enter, spacja, znak tabulacji) i bez użycia dodatkowych zabiegów nie da się tego zmienić.


My na razie nie będziemy się tym problemem zajmować, bowiem pobieranie danych to znacznie bardziej złożone zagadnienie i na razie myślę, że warto skupić się na innych kwestiach.


Podsumowanie

Dzięki tej lekcji wiesz już jak możesz wypisywać wszystkie napisy w dowolnych kombinacjach. Jest to bardzo ważna część, bowiem w ten sposób umożliwiasz sobie komunikację z użytkownikiem.

powrót