String: Różnice pomiędzy wersjami
m (Przekierowanie do Tekstowy typ danych) |
m |
||
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika) | |||
Linia 1: | Linia 1: | ||
− | #redirect[[Tekstowy typ danych]] | + | <!-- #redirect[[Tekstowy typ danych]] --> |
+ | '''String''' - [[typ danych]] służący do przechowywania ciągu znaków ([[Zmienna (informatyka)|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". | ||
+ | |||
+ | == Realizacja == | ||
+ | W niektórych [[Język programowania|językach programowania]] jak np. [[Pascal (język programowania)|Pascal]] czy [[PHP]] łańcuchy są typem wbudowanym; w pozostałych jak [[C (język programowania)|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 (informatyka)|tablica]], której element o indeksie 0 przechowuje liczbę znaków w tym ciągu ([[typ (informatyka)|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 [[zmienna wskaźnikowa|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 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 [[Standard Template Library|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. | ||
+ | |||
+ | 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ść. Przerwania systemu [[MS-DOS]] wykorzystują wariant ASCIIZ polegający na zamianie terminatora '''00h''' na '''$''' (symbol [[dolar]]a). | ||
+ | |||
+ | Zarówno w '''C'''/'''C++''', Pascalu jak i w [[Windows API|WinAPI]] spotkać się można z wariantami łańcuchów ''[[ANSI]]'' oraz ''Wide'', który jest wersją stosującą [[Unicode]] (na każdy znak przeznaczone są 2 bajty). | ||
+ | |||
+ | == Przykłady == | ||
+ | Przykłady operacji na łańcuchach w popularnych językach programowania (pominięto kontrolę błędów). | ||
+ | |||
+ | === [[C# (język programowania)|C#]] === | ||
+ | <syntaxhighlight lang=csharp> | ||
+ | string napis = "C# to język programowania wysokiego poziomu"; | ||
+ | napis += " posiadający stringi"; | ||
+ | Console.WriteLine(napis); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === [[Pascal (język programowania)|Pascal]] === | ||
+ | <syntaxhighlight lang=pascal> | ||
+ | var napis : String; | ||
+ | begin | ||
+ | napis := 'Pascal to język programowania wysokiego poziomu'; | ||
+ | napis := napis + ' posiadający stringi'; | ||
+ | writeln(napis); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | === [[C (język programowania)|C]] === | ||
+ | <syntaxhighlight lang=c> | ||
+ | char napis[200]; | ||
+ | strcpy(napis, "C to język programowania wysokiego poziomu"); | ||
+ | strcat(napis, " posiadający stringi"); | ||
+ | printf("%s", napis); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === [[C++]] === | ||
+ | <syntaxhighlight lang=cpp> | ||
+ | std::string napis = "C++ to język programowania wysokiego poziomu"; | ||
+ | napis += " posiadający stringi"; | ||
+ | std::cout << napis; | ||
+ | </syntaxhighlight> | ||
+ | === [[Java]] === | ||
+ | <syntaxhighlight lang=java> | ||
+ | String napis = "Java to język programowania bardzo wysokiego poziomu"; | ||
+ | napis += " posiadający stringi"; | ||
+ | System.out.println(napis); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === [[PHP]] === | ||
+ | <syntaxhighlight lang=php> | ||
+ | $napis = 'PHP to język skryptowy'; | ||
+ | $napis .= " posiadający stringi"; | ||
+ | echo $napis; | ||
+ | </syntaxhighlight> | ||
+ | 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]]. | ||
+ | |||
+ | === [[Perl]] === | ||
+ | <syntaxhighlight lang=perl> | ||
+ | my $napis = "Perl to język programowania wysokiego poziomu"; | ||
+ | $napis .= " posiadający Stringi"; | ||
+ | print $napis; | ||
+ | </syntaxhighlight> | ||
+ | === [[Python]] === | ||
+ | <syntaxhighlight lang=python> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | === [[Visual Basic]] === | ||
+ | <syntaxhighlight lang=vb> | ||
+ | ' koniecznie w procedurze | ||
+ | Dim napis As String | ||
+ | napis = "Visual Basic (VB) to język programowania" | ||
+ | napis = napis & " posiadający Stringi" | ||
+ | MsgBox napis | ||
+ | </syntaxhighlight> | ||
+ | W [[Visual Basic]]u Stringi realizowane są jako 4-bajtowe [[zmienna wskaźnikowa|wskaźniki]] na pola będące fragmentami struktury [[BSTR]]. | ||
+ | |||
+ | [http://pl.wikipedia.org/w/index.php?title=Tekstowy_typ_danych&oldid=35703716 Źródło] | ||
+ | |||
+ | == Zobacz też == | ||
+ | <htmlet>zobacz-tez</htmlet> | ||
+ | |||
+ | |||
+ | [[Kategoria:Typy danych]] |
Aktualna wersja na dzień 19:17, 11 sty 2014
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".
Spis treści
Realizacja
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 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.
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ść. Przerwania systemu MS-DOS wykorzystują wariant ASCIIZ polegający na zamianie terminatora 00h na $ (symbol dolara).
Zarówno w C/C++, Pascalu jak i w WinAPI spotkać się można z wariantami łańcuchów ANSI oraz Wide, który jest wersją stosującą Unicode (na każdy znak przeznaczone są 2 bajty).
Przykłady
Przykłady operacji na łańcuchach w popularnych językach programowania (pominięto kontrolę błędów).
C#
string napis = "C# to język programowania wysokiego poziomu"; napis += " posiadający stringi"; Console.WriteLine(napis);
Pascal
var napis : String; begin napis := 'Pascal to język programowania wysokiego poziomu'; napis := napis + ' posiadający stringi'; writeln(napis); end.
C
char napis[200]; strcpy(napis, "C to język programowania wysokiego poziomu"); strcat(napis, " posiadający stringi"); printf("%s", napis);
C++
std::string napis = "C++ to język programowania wysokiego poziomu"; napis += " posiadający stringi"; std::cout << napis;
Java
String napis = "Java to język programowania bardzo wysokiego poziomu"; napis += " posiadający stringi"; System.out.println(napis);
PHP
$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.
Perl
my $napis = "Perl to język programowania wysokiego poziomu"; $napis .= " posiadający Stringi"; print $napis;
Python
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
' 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ż
<htmlet>zobacz-tez</htmlet>