close

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