Tekstowy typ danych

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

String - typ danych służący do przechowywania ciągu znaków (zmiennych łańcuchowych).

String można tłumaczyć jako "ciąg znaków" ale także "łańcuch", dlatego używa się również określenia "łańcuch znaków" lub krótko "łańcuch". Etymologicznie odpowiada słowu "strzęp", również dłużej ugruntowanemu frazeologicznie.

Realizacja[edytuj | edytuj kod]

W niektórych językach programowania jak np. Pascal czy PHP łańcuchy są typem wbudowanym; w pozostałych jak C, C++, Java realizuje się je za pomocą innych struktur języka.

W tradycyjnych realizacjach Pascala (np. Turbo Pascal) zmienna typu String może przechowywać do 255 znaków, a w definicji String[długość] może przechowywać do długość znaków, a ma rozmiar długość+1 i jest zaimplementowana jako tablica, której element o indeksie 0 przechowuje liczbę znaków w tym ciągu (typu bajt więc maksymalna długość łańcucha wynosi 255). W późniejszych implementacjach tego języka (np. Object Pascal w Delphi) dodano inną formę reprezentacji łańcucha, w którym maksymalna długość wynosi 2^32 bajtów i jest dynamicznie przydzielana w zależności od długości napisu, typ ten jest rozszerzeniem sposobu implementacji używanego przez C, dodano również typ w stylu C (PChar).

W C łańcuchy reprezentuje się jako tablice znaków, a operacje na nich wykonuje z użyciem wskaźników. Rozmiar takiej tablicy może być dowolny, nie jest oddzielnie przechowywany, a programista musi zadbać o to, by napis nie przekroczył rozmiaru bufora (przepełnienie bufora), a także, by pamięć po buforze była zwolniona. Napis nie musi wypełniać całej tablicy, ponieważ znacznikiem końca napisu jest znak o kodzie zero \0. Taką reprezentację nazywa się z ang. null terminated string.

W C++ oprócz tradycyjnych ciągów znaków w stylu C istnieje w bibliotece standardowej klasa std::string. Ukrywa ona niewygodne aspekty używania napisów w stylu C: zarządzanie pamięcią, określanie długości, łączenie napisów, wstawianie, usuwanie i inne manipulacje na napisie. Dodatkowo pozbyto się problemu znaku kończącego - znak o kodzie \0 może być elementem napisu std::string (długość przechowywana jest oddzielnie). Ponieważ biblioteka standardowa (bazująca w tym zakresie na STL) została dość późno dołączona do oficjalnego standardu, wiele kompilatorów dostarcza własne implementacje typów napisowych - np. String, AnsiString, CString. Również niektóre starsze biblioteki (jak np. Qt) dostarczają własnych typów obsługi napisów.

Przerwania systemu MS-DOS wykorzystują wariant ASCIIZ polegający na zamianie terminatora 00h na $ (symbol dolara). Przy wywoływaniu funkcji 13h przerwania 10h kart graficznych, od EGA wzwyż w architekturze IBM PC i pochodnych, służącej do wyświetlania łańcucha na ekranie, podaje się wskaźnik na początek łańcucha i jego długość.

Zarówno w C/C++, Pascalu jak i w WinAPI spotkać się można z wariantami łańcuchów ANSI oraz Wide, które są wersją stosującą Unicode, a dokładniej kodowanie UTF-16 (na każdy znak przeznaczone są 2 bajty).

Przykłady[edytuj | edytuj kod]

Przykłady operacji na łańcuchach w popularnych językach programowania (pominięto kontrolę błędów).

C#[edytuj | edytuj kod]

   string napis = "C# to język programowania wysokiego poziomu";
   napis += " posiadający stringi";
   Console.WriteLine(napis);

Pascal[edytuj | edytuj kod]

 var napis : String;
 begin
   napis := 'Pascal to język programowania wysokiego poziomu';
   napis := napis + ' posiadający stringi';
   writeln(napis);
 end.

C[edytuj | edytuj kod]

 char napis[200];
 strcpy(napis, "C to język programowania wysokiego poziomu");
 strcat(napis, " posiadający stringi");
 printf("%s", napis);

C++[edytuj | edytuj kod]

std::string napis = "C++ to język programowania wysokiego poziomu";
napis += " posiadający stringi";
std::cout << napis;

Java[edytuj | edytuj kod]

 String napis = "Java to język programowania wysokiego poziomu";
 napis += " posiadający stringi";
 System.out.println(napis);

PHP[edytuj | edytuj kod]

 $napis = 'PHP to język skryptowy';
 $napis .= ' posiadający stringi';
 echo $napis;

W PHP można się spotkać z stringami realizowanymi za pomocą typu Variant o podtypie String. Podobnie jest w innych językach skryptowych takich jak VBS czy JavaScript.

Clarion[edytuj | edytuj kod]

GLO:NAPIS='Clarion to język programowania'
GLO:NAPIS=CLIP(GLO:NAPIS)&' posiadający stringi.'
MESSAGE(CLIP(GLO:NAPIS))

Perl[edytuj | edytuj kod]

 my $napis = "Perl to język programowania wysokiego poziomu";
 $napis .= " posiadający Stringi";
 print $napis;

Python[edytuj | edytuj kod]

 napis = "w Pythonie możemy tworzyć stringi cudzysłowami"
 napis += ', apostrofami'
 napis += """ lub potrójnymi cudzysłowami
 (jeśli chcemy miec tekst w wielu liniach)"""
 print napis

Visual Basic[edytuj | edytuj kod]

 ' koniecznie w procedurze
 Dim napis As String
 napis = "Visual Basic (VB) to język programowania"
 napis = napis & " posiadający Stringi"
 MsgBox napis

W Visual Basicu Stringi realizowane są jako 4-bajtowe wskaźniki na pola będące fragmentami struktury BSTR.

Zobacz też[edytuj | edytuj kod]