Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Kurs C++

Modyfikowanie tekstu i sprawdzanie jego długości

[lekcja] Rozdział 28. Modyfikowanie treści (wstawianie, kopiowanie i usuwanie fragmentów tekstu) oraz sprawdzanie długości tekstu.
Tworząc własne programy praktycznie zawsze pracuje się z tekstem, a skoro tak to warto poświęcić czas na to by poznać możliwości jakie dostajemy za darmo korzystając z klasy std::string. Większość częściej stosowanych narzędzi do pracy z tekstem zostanie omówiona w niniejszym rozdziale - resztę zawsze możesz doczytać w dokumentacji C++.

Sprawdzanie długości tekstu

Do sprawdzania długości tekstu służą dwie metody klasy std::string. Tymi metodami są: size oraz length. Przykład zastosowania metody size został już zaprezentowany w przykładach, które miały miejsce w poprzednim rozdziale. Metoda length zwraca tą samą wartość. W programowaniu współczesnym zaleca się aby używać metody size do odczytywania długości tekstu, a metodę length uważa się na dzień dzisiejszy za przeżytek. Metoda length pozostała standardzie C++ ze względów historycznych i zaleca się unikać używania wspomnianej metody w nowo pisanych aplikacjach. Oto krótki przykład prezentujący działanie metody size oraz length:
C/C++
#include <iostream>
#include <string>

int main()
{
    std::string sNapis = "To jest napis";
    std::cout << "Napis: " << sNapis << std::endl;
    std::cout << "Dlugosc napisu to (metoda size): " << sNapis.size() << std::endl;
    std::cout << "Dlugosc napisu to (metoda length): " << sNapis.length() << std::endl;
    return 0;
}

Pamiętaj, że:
Długość tekstu to liczba znaków występujących w tekście.

Łączenie tekstów

Klasa std::string umożliwia nam sklejanie tekstów. Do sklejania tekstu można wykorzystać przeciążony operator += bądź wywołać metodę append - w obu przypadkach tekst zostanie doklejony na końcu już istniejącej treści. Przykład:
C/C++
std::string tekst = "abc";
tekst += "def";
tekst.append( "ghi" );
std::cout << tekst; //zostanie wypisany tekst: abcdefghi

Wstawianie treści w dowolnym miejscu tekstu

Klasa std::string umożliwia również wstawianie nowej treści w dowolnym miejscu istniejącego tekstu - do tego celu wykorzystuje się metodę insert. Metoda ta posiada wiele wersji wywołań lecz w tym miejscu omówimy tylko najprostszą z dostępnych, która jednocześnie zrealizuje oczekiwane przez nas zadanie. Pierwszym argumentem wspomnianej metody jest pozycja na której ma zostać wstawiony nowy tekst. Pozycja ta jest numerem znaku przed którym ma zostać dopisana nowa treść (pamiętaj, że pozycje są numerowane od zera). Drugim argumentem jest treść, która ma zostać dopisana we wskazanym miejscu do już istniejącego tekstu. Przykład:
C/C++
std::string tekst = "abc";
tekst.insert( 1, "def" );
std::cout << tekst; //zostanie wypisany tekst: adefbc

Należy pamiętać aby pozycja wstawiania tekstu nie była większa niż całkowita długość tekstu do którego ma zostać dopisana nowa treść.

Usuwanie wybranego fragmentu tekstu

Kolejną operacją jaką umożliwia nam klasa std::string jest usuwanie tekstu. Operację usuwania tekstu możemy wykonać za pomocą kilku metod jakie udostępnia nam klasa std::string. W tym miejscu omówię metodę najprostszą i jednocześnie najbardziej praktyczną z punktu widzenia przeciętnego programisty. Aby usunąć fragment tekstu znajdującego się w obiekcie typu std::string należy skorzystać z metody erase. Jedna z metod erase ma następującą postać:
C/C++
std::string & erase( size_type pozycja, size_type liczba_znakow );
Pierwszym argumentem w powyższej metodzie jest pozycja od której chcemy kasować znaki (przypominam, że pozycje znaków numerujemy od zera). Drugim argumentem jest liczba znaków, które chcemy usunąć z tekstu. Usuwając tekst należy pamiętać aby pozycja pierwszego znaku była prawidłowa, czyli nie była większa lub równa liczbie znaków występujących w tekście. Przykład:
C/C++
#include <iostream>
#include <string>

int main()
{
    std::string sNapis = "[Kurs C++] std::string - Modyfikowanie tekstu.";
    sNapis.erase( 10, 14 ); //Kasujemy od dziesiątej pozycji (czyli jedenastego znaku) czternaście znaków
    std::cout << sNapis << std::endl;
    return 0;
}
Standardowe wyjście programu:
[Kurs C++] Modyfikowanie tekstu.

Kopiowanie tekstu

Ostatnią operacją, którą omówię w niniejszym rozdziale jest kopiowanie tekstu. Klasa std::string do kopiowania tekstu posiada metodę copy. Metoda copy nie zostanie jednak omówiona, bowiem jest ona po pierwsze niewygodna, po drugie jest niepraktyczna z punktu widzenia C++, no i po trzecie - jest metoda z którą znacznie lepiej się Ci będzie tekst kopiowało. Tym wygodnym i praktycznym narzędziem metoda insert z tym, że należy skorzystać z innej wersji niż ta, którą poznałeś prawie na początku niniejszego rozdziału. Zanim jednak skopiujemy wybrany fragment tekstu, skopiujmy najpierw cały tekst z jednej zmiennej do drugiej za pomocą rozwiązania, które już znamy:
C/C++
#include <iostream>
#include <string>

int main()
{
    std::string sNapis = "[Kurs C++] std::string - Kopiowanie tekstu.";
    std::string sDrugiNapis;
    sDrugiNapis.insert( 0, sNapis ); //Wstaw przed pozycją zero tekst z obiektu sNapis
    std::cout << sDrugiNapis << std::endl;
    return 0;
}
Standardowe wyjście programu:
[Kurs C++] std::string - Kopiowanie tekstu.
Zgodnie z opisem znanej Ci już metody insert, podane w przykładzie wywołanie wstawi przed pozycją zero tekst przekazany poprzez drugi argument, którym jest akurat zmienna tekstowa. Klasa std::string posiada również metodę insert za pomocą której możemy określić dodatkowo od którego znaku chcemy skopiować tekst przekazany poprzez drugi argument oraz maksymalnie ile znaków chcemy skopiować. Tak więc aby skopiować fragment tekstu z innej zmiennej tekstowej należy wykorzystać metodę:
C/C++
std::string & insert(
size_type pozycja,
const std::string & tekst,
size_type kopiuj_od_znaku,
size_type liczba_znakow_do_skopiowania
);
Jak zapewne domyślasz się z zastosowanych opisów to pierwszy i drugi argument ma takie samo znaczenie jak w przypadku znanej Ci już metody insert, natomiast argument trzeci określa pozycję od którego znaku należy kopiować tekst, a argument czwarty ile maksymalnie znaków ma zostać skopiowanych. Przykład:
C/C++
#include <iostream>
#include <string>

int main()
{
    std::string sNapis = "[Kurs C++] std::string - Kopiowanie tekstu.";
    std::string sFragmentTekstu;
    sFragmentTekstu.insert( 0, sNapis, 1, 8 );
    std::cout << sFragmentTekstu << std::endl;
    return 0;
}
Standardowe wyjście programu:
Kurs C++
Podsumowując, linijkę:
C/C++
sFragmentTekstu.insert( 0, sNapis, 1, 8 );
należy rozumieć następująco:
Wstaw przed pozycją zero tekst z obiektu sNapis od pozycji pierwszej osiem kolejnych znaków.

Zadanie domowe

Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje występujące obok siebie i zastąpi wszystkie znaczniki <b> oraz </b> znacznikami [b] oraz [/b]. Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran. Przykładowy fragment aplikacji, który możesz wykorzystać:
C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string sTekst )
{
    std::string sWynik;
    //TODO: tu należy napisać kod realizujący zadanie
    return sWynik;
}
int main()
{
    std::cout << konwertuj( "<b>to jest </b> testowy       napis     <b>:)" ) << std::endl;
    std::cout << konwertuj( "  s       a         m      e         sp    a   c j    e" ) << std::endl;
    std::cout << konwertuj( "<<B><//b><i></i>" ) << std::endl;
    return 0;
}
Oczekiwane wyjście programu:
[b]to jest [/b] testowy napis [b]:)
 s a m e sp a c j e
<<B><//b><i></i>
Poprzedni dokument Następny dokument
Wyszukiwanie frazy w tekście Słowa kluczowe continue, break