String: Różnice pomiędzy wersjami

Z ToProste
Skocz do: nawigacji, wyszukiwania
m (Zabezpieczył String ([edit=sysop] (na zawsze) [move=sysop] (na zawsze)))
m
 
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ń 18: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".

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.

Źródło

Zobacz też

<htmlet>zobacz-tez</htmlet>