Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Podstawowe operacje na łańcuchach znakowych

SPIS TREŚCI
Tematy pomocnicze
Podrozdziały

Deklaracja zmiennych znakowych i dostęp do przechowywanych znaków

We współczesnych językach programowania znaki są podstawowym typem danych. W pamięci komputera znak jest przechowywany w postaci liczby, którą nazywamy kodem znaku (ang. character code). Każdy znak posiada swój własny kod. Aby różne urządzenia systemu komputerowego mogły w ten sam sposób interpretować kody znaków, opracowano kilka standardów kodowania liter. Poniżej przedstawiamy wybrane dwa:

ASCII – American Standard Code for Information Interchange – Amerykański Standardowy Kod do Wymiany Informacji.

Znaki są zapamiętywane w postaci 8 bitowych kodów (pierwotnie było to 7 bitów, lecz później standard ASCII został poszerzony na 8 bitów, w których znalazły się różne znaki narodowe). Taki sposób reprezentacji znaków jest dzisiaj bardzo wygodny, ponieważ podstawowa komórka pamięci komputera IBM przechowuje właśnie 8 bitów. Dzięki temu znaki dobrze mieszczą się w pamięci.

8-bitowy kod pozwala przedstawić 256 różnych wartości i tylko tyle może być zdefiniowane znaków w kodzie ASCII. Pierwsza połówka zbioru kodów – od 0 do 127 – jest zdefiniowana na stałe i raczej nigdy nie jest modyfikowana. Jest to tzw. podstawowy zestaw znaków ASCII. Druga połówka – od 128 do 255 – zawiera znaki narodowe, które w różny sposób mogą być przydzielane rozszerzonym kodom ASCII. Z tego właśnie powodu powstały różne strony kodowe. Na przykład konsola znakowa stosuje kodowanie LATIN II. Natomiast system Windows stosuje Windows 1250. Niestety, w obu systemach polskie literki posiadają różne kody. Dlatego wyświetlenie przygotowanego w Windows polskiego tekstu w konsoli znakowej powoduje, iż polskie znaki Windows 1250 zostają źle zinterpretowane w konsoli LATIN II. Problem ten nie występuje w systemach linuksowych (oraz w języku Python, który stosuje kodowanie UTF-8).


Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Poniższy program demonstruje niekompatybilność kodowania znaków w Windows ze znakami wyświetlanymi w oknie konsoli znakowej.
Pascal
program prg;

begin
  writeln('ĄąĆćĘꣳŃńÓ󌜏źŻż');
end.
─ä─ů─ć─ç─ś─Ö┼ü┼é┼â┼ä├ô├│┼Ü┼Ť┼╣┼║┼╗┼╝
C++
#include <iostream>

using namespace std;

int main()
{
  cout << "ĄąĆćĘꣳŃńÓ󌜏źŻż\n";
  return 0;
}
ą╣ĂŠ╩ŕú│нˡîťĆč»┐
Basic
Print "ĄąĆćĘꣳŃńÓ󌜏źŻż"
End
ą╣ĂŠ╩ŕú│нˡîťĆč»┐

Język Python koduje litery w standardzie UTF-8, dzięki temu nie występuje tu problem niezgodności kodowania polskich znaków w konsoli i w Windows.

Python (dodatek)
print("ĄąĆćĘꣳŃńÓ󌜏źŻż")
ĄąĆćĘꣳŃńÓ󌜏źŻż

W języku C++ istnieje funkcja, która ustawia w konsoli znakowej ten sam system kodowania znaków używany przez Windows:

setlocale(LC_ALL, "");

Dzięki niej można tworzyć programy komunikujące się z użytkownikiem w języku polskim:

C++
#include <iostream>

using namespace std;

int main()
{
    setlocale (LC_ALL, "");

    cout << "Zażółć żabią jaźń" << endl;
    return 0;
}
Zażółć żabią jaźń

W tym artykule nie będziemy jednak korzystać z tej funkcji, ponieważ brak jej odpowiedników w innych językach programowania. Nie wpłynie to w żaden sposób na przedstawione tu algorytmy tekstowe. Problem lokalizacji nie sprowadza się jedynie do poprawnego wypisywania polskich literek ą, ć, ę… Obejmuje on również sposób zapisu waluty, dat, liczb ułamkowych, sortowania wg polskiego alfabetu, itp. Problemy te rozwiązuje system operacyjny, jednak program użytkownika musi być napisany w określony sposób. Tym się tutaj nie zajmujemy.

Unicode

Znaki są zapamiętywane w postaci kodów 16-bitowych. Dzięki temu rozwiązaniu liczba możliwych do przedstawienia znaków rośnie do 65536. Pierwsze 256 kodów jest zwykle kompatybilne z kodami ASCII. Kody powyżej 256 tworzą banki znaków, w których znajdują się wszystkie znaki narodowe, arabskie, hebrajskie, matematyczne itp.

Poniższa tabelka prezentuje nazwy typów znakowych w wybranych przez nas językach programowania:

  Pascal
ASCII
char
Unicode
widechar
wchar
  C++
ASCII
unsigned char
Unicode
wchar_t
  Basic
ASCII
String * 1
Unicode
Wstring * 1

W języku Free Basic nie ma prostego typu znakowego. W tym charakterze używamy łańcucha znakowego o stałej długości 1, o czym piszemy dalej.

W języku Python znaki są kodowane w systemie UTF-8 (ang. Unicode Transformation Format – opis kodowania UTF znajdziesz w  Internecie).  Nie istnieje tu osobny typ znakowy jak w innych językach programowania.

Zmienna w Pythonie otrzymuje typ poprzez przypisanie i typ ten można zmieniać w programie. Technicznie robione jest to w ten sposób, iż dane są tworzone w pamięci, a w zmiennej jest umieszczany jedynie ich adres (wskaźnik, referencja). Informacja o typie danych przechowywana jest wraz z danymi. Zmienna w Pythonie jest wskaźnikiem (referencją) do danych. Przypisanie danej do zmiennej, powoduje umieszczenie jej adresu w zmiennej. Dzięki takiemu rozwiązaniu zmienne mogą wskazywać dane o różnych typach.

Poniższy program tworzy dane różnych typów, a następnie przypisuje ich adresy zmiennej x. Typ danych wskazywanych przez x otrzymujemy przy pomocy funkcji type(zmienna).

Python (dodatek)
x = 10
print(x, type(x)) # Liczba całkowita
x = 10.5
print(x, type(x)) # Liczba rzeczywista
x = True
print(x, type(x)) # Wartość logiczna
x = "Liczba 10"
print(x, type(x)) # Łańcuch znakowy
x = ["x = ", 10, 5.1, False] 
print(x, type(x)) # Lista, itd.
10 <class 'int'>
10.5 <class 'float'>
True <class 'bool'>
Liczba 10 <class 'str'>
['x = ', 10, 5.1, False] <class 'list'>

W Pythonie łańcuch znakowy zawierający jeden znak jest odpowiednikiem znaku w innych językach. Ponieważ łańcuchy używają systemu kodowania UTF-8, to znak może odpowiadać różnej liczbie bajtów (od 1 do 4). Przy operacjach na łańcuchach znakowych nie ma to zwykle znaczenia.

Zmienne znakowe deklarujemy w identyczny sposób jak zmienne innych typów:

  Pascal

Deklaracja
zmiennej
znakowej

…
var
  c  : char;
  wc : wchar;
…
  C++
Deklaracja
zmiennej
znakowej
…
char c;
wchar_t wc;
…
  Basic
Deklaracja
zmiennej
znakowej
…
Dim c  As String * 1
Dim wc As Wstring * 1
…

Tak zadeklarowana zmienna c może przechowywać jeden znak ASCII, a zmienna wc jeden znak Unicode.

W Pythonie nie ma osobnych zmiennych znakowych. Odpowiednikiem takich zmiennych są łańcuchy zawierające jeden znak. Łańcuch w Pythonie jest obiektem dynamicznym i może zawierać dowolną liczbę znaków. Znaki są kodowane w systemie UTF-8.

Python (dodatek)
a = "A" # odpowiednik zmiennej znakowej
print("Znak '%s' o kodzie %d" % (a, ord(a)))
a = "ś"
print("Znak '%s' o kodzie %d" % (a, ord(a)))
Znak 'A' o kodzie 65
Znak 'ś' o kodzie 347

Znaki o kodach od 32 do 127 odpowiadają znakom kodu ASCII:

Python (dodatek)
c = 0
for i in range(32, 128):
    print(chr(i), end="")
    c += 1
    if c == 32:
        c = 0
        print()
 !"#$%&'()*+, -./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~

Znaki te zawierają między innymi duże i małe litery alfabetu łacińskiego oraz cyfry.

Duże litery: A…Z, kody od 65 do 90
Małe litery: a…z, kody od 97 do 122
Cyfry:       0…9, kody od 48 do 57

Zmienne znakowe mogą również być zadeklarowane jako tablice znaków.

  Pascal

Deklaracja
tablicy
znakowej

…
var
  c  : array [0..99] of char;
  wc : array [0..99] of wchar;
…
  C++
Deklaracja
tablicy
znakowej
…
char     c[100];
wchar_t wc[100];
…
  Basic
Deklaracja
tablicy
znakowej
…
Dim  c As String  * 100
Dim wc As Wstring * 100
…
  Python (dodatek)
Deklaracja
tablicy
znakowej
…
c = "x" * 100
…

W przypadku tablicy znakowej mamy dostęp do poszczególnych znaków za pomocą indeksu w klamerkach kwadratowych. Wyjątkiem jest język Basic, gdzie zmienna znakowa jest traktowana jako spójna całość i dostęp do poszczególnych znaków uzyskujemy poprzez polecenie Mid (przy zapisie do zmiennej) oraz funkcję Mid (przy odczycie ze zmiennej). Pierwszy znak posiada zawsze indeks równy 1.

W Pythonie odpowiednikiem tablicy znakowej jest łańcuch znaków. Dostęp do poszczególnych znaków wykonywany jest przy pomocy indeksów w klamerkach kwadratowych. Pierwszy znak ma indeks 0. Indeksy mogą również być ujemne, wtedy oznaczają znaki od końca łańcucha:

indeksy
dodatnie
0
1
2
3
4
5
6
7
Tekst:
A
L
I
G
A
T
O
R
indeksy
ujemne
-8
-7
-6
-5
-4
-3
-2
-1
Python (dodatek)
a = "ALIGATOR"
print("a : %s" % a)
print("----------")
for i in range(8):
    print(" a[%d] : '%s'" % (i, a[i]))
print("----------")
for i in range(-1, -9, -1):
    print("a[%d] : '%s'" % (i, a[i]))
a : ALIGATOR
----------
 a[0] : 'A'
 a[1] : 'L'
 a[2] : 'I'
 a[3] : 'G'
 a[4] : 'A'
 a[5] : 'T'
 a[6] : 'O'
 a[7] : 'R'
----------
a[-1] : 'R'
a[-2] : 'O'
a[-3] : 'T'
a[-4] : 'A'
a[-5] : 'G'
a[-6] : 'I'
a[-7] : 'L'
a[-8] : 'A'

W Pythonie łańcuch znakowy jest obiektem niezmiennym (ang. immutable). Oznacza to, iż nie możesz zmieniać znaków wewnątrz łańcucha, np. poprzez przypisanie:

a[indeks] = "nowy_znak"

Jeśli chcemy wykonać taką operację, to musimy utworzyć nową kopię łańcucha, a znak wymienić przy pomocy tzw. slicingu. Jeśli a jest łańcuchem, to

a[start:koniec] zwraca kopię łańcucha od indeksu start do indeksu poprzedzającego koniec
a
[:koniec] zwraca kopię łańcucha od jego początku do indeksu poprzedzającego koniec
a
[start:] zwraca kopię łańcucha od  indeksu start do końca łańcucha.

Poniższy program wymienia drugi znak łańcucha "LASEK" z "A" na "I":

Python (dodatek)
s = "LASEK" # niezmienny łańcuch
print(s)
s = s[:1]+"I"+s[2:] # nowy łańcuch
print(s)
LASEK
LISEK

Wymiana znaku na pozycji x wykonywana jest wg schematu:

a = a[:x]+"znak"+a[x+1:]

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program tworzy trzyznakową tablicę i wpisuje do niej wyraz ALO. Następnie literki są wypisywane w  kierunku odwrotnym:
Pascal
program prg;

var
  s : array [0..2] of char;

begin
  s[0] := 'A';
  s[1] := 'L';
  s[2] := 'O';
  writeln(s[2], s[1], s[0]);
end.
C++
#include <iostream>

using namespace std;

int main()
{
  unsigned char s[3];
 
  s[0] = 'A';
  s[1] = 'L';
  s[2] = 'O';
  cout << s[2] << s[1] << s[0]
       << endl << endl;
  return 0;
}
Basic
Dim s As String * 3
Mid(s, 1) = "A"
Mid(s, 2) = "L"
Mid(s, 3) = "O"
Print Mid(s, 3, 1);
Print Mid(s, 2, 1);
Print Mid(s, 1, 1)
End
Python (dodatek)
s = "ALO"
print(s[2], end="")
print(s[1], end="")
print(s[0])
print()
Wynik:
OLA

Oprócz zwykłych tablic znakowych (ang. character tables), języki Pascal, C++, Basic i Python udostępniają tzw. łańcuchy znakowe (ang. character strings). Są to tablice dynamiczne, które mogą przechowywać ciągi znaków o różnych długościach (łańcuchy automatycznie dopasowują się do rozmiaru przechowywanego tekstu – tablice znakowe natomiast nie posiadają takich cech, programista musi o to zadbać sam):

  Pascal
łańcuch ASCII
ansistring
łańcuch Unicode
widestring
  C++
łańcuch ASCII
string
łańcuch Unicode
wstring
  Basic
łańcuch ASCII
String
łańcuch Unicode
Wstring Ptr

Koniec łańcucha znakowego znaczony jest kodem 0. Znak o tym kodzie nie jest wliczany do łańcucha. Również nie powinieneś tego znaku umieszczać wewnątrz łańcucha, gdyż może to spowodować nieprawidłowe działanie wielu funkcji i procedur tekstowych.

W języku Pascal i Basic indeksy znaków w łańcuchu rozpoczynają się od 1, a w języku C++ i Python od 0. W algorytmach tekstowych musimy wziąć na to poprawkę.

W języku Basic łańcuchy Wstring są wskaźnikami do obszaru pamięci przechowującego właściwe znaki. Dlatego do wskaźnika musi być przypisywany adres zarezerwowanego obszaru, w którym będą umieszczane znaki Unicode. Dostęp do danych następuje poprzez operator *, podobnie jak w języku C++.

Liczbę znaków przechowywanych w łańcuchu tekstowym otrzymamy przy pomocy następujących funkcji:

  Pascal
Długość łańcucha
length(s)
  C++
Długość łańcucha
s.length()
s.size()
  Basic
Długość łańcucha
Len(s)
  Python
Długość łańcucha
len(s)

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Programy demonstrują sposoby deklarowania zmiennej łańcuchowej oraz dostępu do znaków zawartych w  łańcuchu.
Pascal
program prg;

var
  s : ansistring;
  i : integer;

begin
  s := 'Hello there!!!';
  for i := length(s) downto 1 do
    write(s[i]);
  writeln; writeln;
end.
Pascal
program prg;

var
  s : widestring;
  i : integer;

begin
  s := 'Hello there!!!';
  for i := length(s) downto 1 do
    write(s[i]);
  writeln; writeln;
end.
C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;
  s = "Hello there!!!";
  for(int i = s.length()-1; i >= 0; i--)
    cout << s[i];
  cout << endl << endl;
  return 0;
}
C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  wstring s;
  s = L"Hello there!!!";
  for(int i = s.length()-1; i >= 0; i--)
    cout << (char)s[i];
  cout << endl << endl;
  return 0;
}
Basic
Dim s As String
Dim i As Integer

s = "Hello there!!!"
For i = Len(s) To 1 Step-1
  Print Mid(s, i, 1);
Next
Print: Print
End
Basic
Dim s As Wstring Ptr
Dim i As Integer

s = Allocate (20 * Len(Wstring))
*s = "Hello there!!!"
For i = Len(*s) To 1 Step-1
  Print Mid(*s, i, 1);
Next
Print: Print
End
Python (dodatek)
s = "Hello there!!!"
for i in reversed(range(len(s))):
    print(s[i], end="")
print()
print()
Wynik:
!!!ereht olleH

Na początek:  podrozdziału   strony 

Kod znaku

Przy przetwarzaniu tekstu często musimy odczytywać kody znaków zawartych w zmiennej znakowej lub zamieniać kody na odpowiadające im znaki – na przykład w celu umieszczenia ich w tekście. W każdym z wybranych przez nas języków programowania istnieją odpowiednie do tego zadania narzędzia.

  Pascal
kodu znaku
ord(znak)
kod na znak
chr(kod)
  C++
kodu znaku
(int)znak
kod na znak
(char)kod
  Basic
kodu znaku
Asc(znak)
kod na znak
Chr(kod)
  Python
kodu znaku
ord(znak)
kod na znak
chr(kod)

Język C++ traktuje znaki jak liczby całkowite (unsigned char – bez znaku, char – ze znakiem). Nie ma zatem zwykle potrzeby dokonywać konwersji znakowych. Wyjątek stanowi przesyłanie znaków do strumieni –  musimy dokonać konwersji kodu znaku na typ char, aby w strumieniu został zapisany znak, a nie jego kod jako liczba całkowita.


Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program odczytuje z klawiatury łańcuch znaków do zmiennej łańcuchowej, a następnie wypisuje kolejne literki wraz z ich kodami ASCII.
Pascal
program prg;

var
  s : ansistring;
  i : integer;
begin
  readln(s);
  writeln;
  for i := 1 to length(s) do
    writeln(s[i], ' : ', ord(s[i]):3);
  writeln;
end.
C++
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
  string s;

  getline(cin, s);
  cout << endl;
  for(unsigned i = 0; i < s.length(); i++)
    cout << s[i] << ": "
         << setw(3) << (int)s[i] << endl;
  cout << endl;
  return 0;
}
Basic
Dim s As String, i As Integer

Input s
Print
For i = 1 To Len (s)
  Print Using "! : ###";Mid(s, i, 1);Asc(Mid(s, i, 1))
Next
Print
End
Python (dodatek)
s = input()
print()
for i in range(len(s)):
    print("%s : %3d" % (s[i], ord(s[i])))
print()
Python (dodatek)
s = input()
print()
for i in s: # i-kolejne znaki w s
    print("%s : %3d" % (i, ord(i)))
print()
Wynik:
Aligator Arek

A :  65
l : 108
i : 105
g : 103
a :  97
t : 116
o : 111
r : 114
  :  32
A :  65
r : 114
e : 101
k : 107

Na początek:  podrozdziału   strony 

Konkatencja – łączenie łańcuchów

Często zdarza się, iż chcemy połączyć dwa lub więcej tekstów w jeden tekst. Operacja łączenia tekstu nosi nazwę konkatencji (ang. concatenation). W przypadku łańcuchów jest to bardzo proste:

  Pascal
Łączymy łańcuch s1 z s2
i wynik połączenia
umieszczamy w s3
s3 := s1+s2;
  C++
Łączymy łańcuch s1 z s2
i wynik połączenia
umieszczamy w s3
s3 = s1+s2;
  Basic
Łączymy łańcuch s1 z s2
i wynik połączenia
umieszczamy w s3
s3 = s1+s2
  Python
Łączymy łańcuch s1 z s2
i wynik połączenia
umieszczamy w s3
s3 = s1+s2

Na początek:  podrozdziału   strony 

Wstawianie znaku/ciągu znaków do łańcucha

Podmiana znaku w łańcuchu jest operacją prostą. Po prostu odwołujemy się do wybranego elementu w zmiennej łańcuchowej – może nią być również tablica znaków – i zapisujemy go nową zawartością:

  Pascal
Zamiana znaku
na pozycji i-tej
w łańcuchu s
s[i] := 'znak';
s[i] := char(kod);
  C++
Zamiana znaku
na pozycji i-tej
w łańcuchu s
s[i] = 'znak';
s[i] = kod
  Basic
Zamiana znaku
na pozycji i-tej
w łańcuchu s
Mid(s, i, 1) = "znak"
Mid(s, i, 1) = Chr(kod)
  Python
Zamiana znaku
na pozycji i-tej
w łańcuchu s
s = s[:i]+"znak"+s[i+1:]
s = s[:i]+chr(kod)+s[i+1:]

Wstawienie znaku wymaga przesunięcia części znaków w zmiennej łańcuchowej, aby udostępnić miejsce na wstawiany znak. Operacja wstawiania znaku lub łańcucha znaków jest obsługiwana przez funkcje biblioteczne:

  Pascal
Wstawiamy łańcuch s1
na pozycję i-tą
w łańcuchu s2
insert(s1, s2, i);
  C++
Wstawiamy łańcuch s1
na pozycję i-tą
w łańcuchu s2
s2.insert(i, s1);
  Basic
Wstawiamy łańcuch s1
na pozycję i-tą
w łańcuchu s2
s2 = Left(s2, i-1)+s1+Right(s2, Len(s2)-i+1)
  Python
Wstawiamy łańcuch s1
na pozycję i-tą
w łańcuchu s2
s2 = s2[:i]+s1+s2[i:]

Język FreeBasic nie posiada bezpośredniej funkcji wstawiania znaku lub łańcucha do innego łańcucha. Dlatego posiłkujemy się dwoma funkcjami pomocniczymi:

Left(s, i) – zwraca i pierwszych znaków łańcucha s. Jeśli i = 0, to zwraca łańcuch pusty.
Right(s, i) – zwraca i ostatnich znaków łańcucha s. Jeśli i = 0, to zwraca łańcuch pusty.

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program umieszcza w łańcuchu tekstowym zdanie "Rudy lisek", a następnie wstawia łańcuch ", szybki" po słowie "Rudy".
Pascal
program prg;

var
  s : ansistring;
begin
  s := 'Rudy lisek';
  writeln(s);
  insert (', szybki', s, 5);
  writeln(s);
  writeln;
end.
C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;

  s = "Rudy lisek";
  cout << s << endl;
  s.insert(4, ", szybki");
  cout << s << endl << endl;
  return 0;
}
Basic
Dim s As String

s = "Rudy lisek"
Print s
s = Left(s, 4)+", szybki"+Right(s, 6)
Print s
Print
End
Python (dodatek)
s = "Rudy lisek"
print(s)
s = s[:4]+", szybki"+s[4:]
print(s)
print()
Wynik:
Rudy lisek
Rudy, szybki lisek

Na początek:  podrozdziału   strony 

Usuwanie znaku z łańcucha

Usunięcie znaku z łańcucha/tablicy polega na przesunięciu wszystkich znaków następujących za znakiem usuwanym o jedną pozycję w lewo. W ten sposób znak zostaje nadpisany znakiem sąsiadującym z prawej strony – w efekcie zniknie on z łańcucha. Dla łańcuchów znakowych mamy w każdym z wybranych języków programowania gotowe funkcje usuwania znaku lub fragmentu łańcucha.

  Pascal
Usuwamy z łańcucha s
n znaków począwszy
od pozycji i-tej
delete(s, i, n);
  C++
Usuwamy z łańcucha s
n znaków począwszy
od pozycji i-tej
s.erase(i, n);
  Basic
Usuwamy z łańcucha s
n znaków począwszy
od pozycji i-tej
s = Left(s, i-1)+Right(s, Len(s)-i-n+1)
  Python
Usuwamy z łańcucha s
n znaków począwszy
od pozycji i-tej
s = s[:i]+s[i+n:]

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program umieszcza w łańcuchu tekstowym zdanie "Rakieta kosmiczna", a następnie usuwa z wyrazu "kosmiczna" literkę 's'.
Pascal
program prg;

var
  s : ansistring;
begin
  s := 'Rakieta kosmiczna';
  writeln(s);
  delete(s, 11, 1);
  writeln(s);
  writeln;
end.
C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;

  s = "Rakieta kosmiczna";
  cout << s << endl;
  s.erase(10, 1);
  cout << s << endl << endl;
  return 0;
}
Basic
Dim s As String

s = "Rakieta kosmiczna"
Print s
s = Left(s, 10)+Right(s, 6)
Print s End
Python (dodatek)
s = "Rakieta kosmiczna"
print(s)
s = s[:10]+s[11:]
print(s)
Wynik:
Rakieta kosmiczna
Rakieta komiczna

Na początek:  podrozdziału   strony 

Zastępowanie fragmentu łańcucha innym łańcuchem tekstowym

Zastępując fragment łańcucha innym łańcuchem możemy wykorzystać funkcje usuwania i wstawiania tekstu – najpierw usuwamy zastępowany fragment z łańcucha, a następnie wstawiamy na jego miejsce nowy fragment. W języku C++ możemy wykorzystać funkcję składową replace( ) klasy string, która wykonuje dokładnie to samo zadanie. W języku FreeBasic wykorzystujemy funkcje Left( ) i Right( ).

  Pascal
n znaków od pozycji i-tej
w łańcuchu s2 zastępujemy
łańcuchem s1
delete(s2, i, n);
insert(s1, s2, i);
  C++
n znaków od pozycji i-tej
w łańcuchu s2 zastępujemy
łańcuchem s1
s2.replace(i, n, s1);
  Basic
n znaków od pozycji i-tej
w łańcuchu s2 zastępujemy
łańcuchem s1
s2 = Left(s2, i-1)+s1+Right(s2, Len(s2)-i-n+1)
  Python
n znaków od pozycji i-tej
w łańcuchu s2 zastępujemy
łańcuchem s1
s2 = s2[:i]+s1+s2[i+n:]

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program umieszcza w łańcuchu tekstowym zdanie "Zielone, stare drzewko", a następnie wymienia wyraz "stare" na "wysokie".
Pascal
program prg;

var
  s : ansistring;
begin
  s := 'Zielone, stare drzewko';
  writeln(s);
  delete(s, 10, 5);
  insert('wysokie', s, 10);
  writeln(s);
  writeln;
end.
C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s;

  s = "Zielone, stare drzewko";
  cout << s << endl;
  s.replace(9, 5, "wysokie");
  cout << s << endl << endl;
  return 0;
}
Basic
Dim s As String

s = "Zielone, stare drzewko"
Print s
s = Left(s, 9)+"wysokie"+Right(s, 8)
Print s
End
Python (dodatek)
s = "Zielone, stare drzewko"
print(s)
s = s[:9]+"wysokie"+s[14:]
print(s)
Wynik:
Zielone, stare drzewko
Zielone, wysokie drzewko

Na początek:  podrozdziału   strony 

Porównywanie łańcuchów

Łańcuchy tekstowe możemy porównywać przy pomocy typowych operatorów porównań. Jednakże obowiązuje tutaj kilka zasad.

Dwa łańcuchy są równe, jeśli składają się z takiej samej liczby znaków oraz zgadzają się ze sobą na każdej pozycji znakowej.

Jeśli dwa łańcuchy mają różną długość, lecz krótszy łańcuch zawiera te same początkowe znaki co łańcuch dłuższy, to krótszy jest mniejszy, a dłuższy jest większy.

W dwóch łańcuchach porównywane są znaki na odpowiadających sobie pozycjach znakowych aż do napotkania niezgodności kodów. Wtedy mniejszy łańcuch jest tym, który posiada na porównywanej pozycji znak o mniejszym kodzie. Na przykład:

"ALA" > "AKACJA" – kod literki L jest większy od kodu literki K.

Taki sposób porównywania nosi nazwę leksykograficznego. Zwróć uwagę, iż w ten sposób nie można porównywać łańcuchów zawierających polskie litery – poprawny będzie jedynie test na równość łańcuchów.


Na początek:  podrozdziału   strony 

Pozostałe operacje tekstowe

W poniższej tabelce zebraliśmy często wykonywane, typowe operacje na tekstach. Z operacji tych będziemy intensywnie korzystać w przykładach programowych do omawianych algorytmów tekstowych.

  Pascal
Odczyt wiersza znaków
ze standardowego wejścia
readlns);
write('opis'); readln(s) 
Zapis łańcucha znaków
na standardowe wyjście
writeln(s);
write(s);
Sprawdzenie,
czy łańcuch jest pusty
if s = '' then …
if length(s) = 0 then …
Kopiowanie n znaków
łańcucha s1 od pozycji i-tej
do łańcucha s2
s2 = copy(s1, i, n);
Kopiowanie n początkowych
znaków łańcucha s1
do łańcucha s2
s2 = copy(s1, 1, n);
Kopiowanie n końcowych
znaków łańcucha s1
do łańcucha s2
s2 = copy(s1, length(s1)-n+1, n);
  C++
Odczyt wiersza znaków
ze standardowego wejścia
getline(cin, s);
cout << "opis"; getline(cin, s)
Zapis łańcucha znaków
na standardowe wyjście
cout << s << endl;
cout << s;
Sprawdzenie,
czy łańcuch jest pusty
if(s == "") …
if(!s.length())…
if(!s.size())…
Kopiowanie n znaków
łańcucha s1 od pozycji i-tej
do łańcucha s2
s2 = s1.substr(i, n);
Kopiowanie n początkowych
znaków łańcucha s1
do łańcucha s2
s2 = s1.substr(0, n);
Kopiowanie końcowych
znaków łańcucha s1
do łańcucha s2
s2 = s1.substr(s1.length()-n);
  Basic
Odczyt wiersza znaków
ze standardowego wejścia
Line Input s
Line Input "opis";s
Zapis łańcucha znaków
na standardowe wyjście
Print s
Print s;
Sprawdzenie,
czy łańcuch jest pusty
If s = "" Then …
If Len(s) = 0 Then …
Kopiowanie n znaków
łańcucha s1 od pozycji i-tej
do łańcucha s2
s2 = Mid(s1, i, n)
Kopiowanie n początkowych
znaków łańcucha s1
do łańcucha s2
s2 = Left(s1, n)
Kopiowanie n końcowych
znaków łańcucha s1
do łańcucha s2
s2 = Right(s1, n)
  Python
Odczyt wiersza znaków
ze standardowego wejścia
s = input()
s = input("opis")
Zapis łańcucha znaków
na standardowe wyjście
print(s)
print(s, end="")
Sprawdzenie,
czy łańcuch jest pusty
if s == "": …
if not s: …
Kopiowanie n znaków
łańcucha s1 od pozycji i-tej
do łańcucha s2
s2 = s1[i:i+n]
Kopiowanie n początkowych
znaków łańcucha s1
do łańcucha s2
s2 = s1[:n]
Kopiowanie n końcowych
znaków łańcucha s1
do łańcucha s2
s2 = s1[-n:]

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.