Praca z stingami

Pierwszy kontakt z std::string w C++ – jak działa ten prosty program?

W C++ bardzo często zaczynamy od programów w stylu:

std::string name;
std::cout << "What is your name? ";
getline (std::cin, name);
std::cout << "Hello, " << name << "!\n";

Na pierwszy rzut oka wygląda to niewinnie: program pyta o imię i wita użytkownika. Ale w tym krótkim fragmencie dzieje się całkiem sporo – zwłaszcza jeśli chodzi o to, jak działa std::string i wczytywanie tekstu z klawiatury.

W tym artykule rozłożymy ten kod na części i wyjaśnimy krok po kroku, co się dzieje „pod maską”.


Czym jest std::string?

W C++ typ std::string to łańcuch znaków, czyli po prostu tekst.

Możesz o nim myśleć jak o pudełku, w którym przechowywany jest napis — np.:

  • "Agnieszka"

  • "Marcin"

  • "Ala ma kota"

W przeciwieństwie do „starego” stylu z tablicami znaków (char imie[20];), std::string:

  • sam dba o długość napisu,

  • pozwala przechowywać napisy o różnej długości (dopasowuje się),

  • jest łatwiejszy w użyciu i bardziej bezpieczny.

Żeby korzystać z std::string, na początku programu potrzebujemy:

#include <string>

I właśnie taki typ pojawia się w naszym przykładzie:

std::string name;

To oznacza: zadeklaruj zmienną name typu std::string, czyli przygotuj miejsce na przechowanie jakiegoś tekstu – w tym przypadku imienia użytkownika.


std::cout – wypisywanie tekstu na ekran

Kolejna linijka:

std::cout << "What is your name? ";
  • std::cout – to tzw. standardowe wyjście, zwykle po prostu ekran konsoli.

  • Operator << – możesz go czytać jako „wyślij do”.

Czyli:

„Wyślij tekst What is your name? do strumienia wyjściowego (na ekran).”

Po wykonaniu tego w konsoli pojawi się:

What is your name? _

(kursor będzie czekał na wpisanie danych przez użytkownika).


getline(std::cin, name); – dlaczego nie samo cin >> name?

Kluczowa linia:

getline (std::cin, name);

Tutaj dzieje się coś ważnego:

  • std::cin – to standardowe wejście, czyli dane wpisywane z klawiatury.

  • Funkcja getline wczytuje całą linię tekstu, aż do naciśnięcia klawisza Enter.

  • Wszystko, co użytkownik wpisze, zostanie zapisane do zmiennej name typu std::string.

Przykład:
Jeśli użytkownik wpisze:

Agnieszka Kowalska

to do name trafi dokładnie:

"Agnieszka Kowalska"

A co by było, gdybyśmy użyli std::cin >> name;?

Gdyby kod wyglądał tak:

std::cin >> name;

to wczytane zostałoby tylko pierwsze słowo (do spacji), np.:

  • użytkownik wpisuje: Agnieszka Kowalska

  • w name ląduje tylko: "Agnieszka"

Dlatego getline jest lepsze, gdy chcemy wczytać całe imię i nazwisko lub jakikolwiek tekst zawierający spacje.


Sklejanie tekstu – operator << w akcji

Ostatnia linia:

std::cout << "Hello, " << name << "!\n";

Tutaj widać siłę std::string i operatora <<:

  • "Hello, " – zwykły napis (stały tekst),

  • name – nasza zmienna typu std::string,

  • "!\n" – kolejny napis, gdzie \n oznacza przejście do nowej linii.

Operator << pozwala nam „doklejać” kolejne elementy do wyjścia.
Dla użytkownika, który wpisał np.:

Agnieszka Kowalska

program wyświetli:

Hello, Agnieszka Kowalska!

Potem \n przeniesie kursor do nowej linii.


Co dokładnie robi ten program – krok po kroku

Zbierzmy to w całość:

  1. Deklaracja zmiennej tekstowej:

    std::string name;
    

    Program przygotowuje zmienną name na przechowanie imienia użytkownika.

  2. Wyświetlenie pytania:

    std::cout << "What is your name? ";
    

    Użytkownik widzi na ekranie pytanie i kursor czekający na wpisanie odpowiedzi.

  3. Wczytanie całej linii tekstu z klawiatury:

    getline (std::cin, name);
    

    Program czeka, aż użytkownik wpisze tekst i naciśnie Enter.
    Cały wpisany tekst (wraz ze spacjami) trafia do name.

  4. Przywitanie użytkownika z użyciem podanego imienia:

    std::cout << "Hello, " << name << "!\n";
    

    Program wypisuje powitanie, „doklejając” wartość zmiennej name do reszty napisu.


Dlaczego warto używać std::string?

Podsumujmy najważniejsze zalety:

  • Bezpieczeństwo – nie martwisz się o ręczne liczenie rozmiaru tablicy znaków.

  • Wygodastd::string współpracuje z getline, std::cout, std::cin i wieloma innymi funkcjami.

  • Bogate możliwości – możesz:

    • sprawdzić długość: name.length(),

    • dodać coś do napisu: name += "!",

    • pobrać pojedynczy znak: name[0],

    • porównywać napisy: if (name == "Marcin") ....


Małe rozszerzenie – wariant z polskim komunikatem

Jeżeli chcesz, możesz ten sam program zrobić po polsku:

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "Jak masz na imię? ";
    std::getline(std::cin, name);
    std::cout << "Cześć, " << name << "!\n";
    return 0;
}

To dobry przykład do pokazania uczniom:

  • jak działają łańcuchy znaków,

  • jak wczytywać całe zdanie, a nie tylko jedno słowo,

  • jak łączyć tekst stały z danymi wprowadzonymi przez użytkownika.


Podsumowanie

Ten prosty fragment kodu:

std::string name;
std::cout << "What is your name? ";
getline (std::cin, name);
std::cout << "Hello, " << name << "!\n";

to świetny punkt startowy do rozmowy o:

  • typie std::string,

  • wczytywaniu tekstu funkcją getline,

  • pracy ze strumieniami wejścia/wyjścia (std::cin, std::cout),

  • oraz o tym, jak program może interaktywnie współpracować z użytkownikiem.

Z takiego małego przykładu można zbudować kolejne kroki: pytanie o wiek, ulubiony język programowania, prosty quiz czy formularz w konsoli. A wszystko zaczyna się od jednego std::string name;.

Zostaw komentarz

Koszyk