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
getlinewczytuje całą linię tekstu, aż do naciśnięcia klawisza Enter.Wszystko, co użytkownik wpisze, zostanie zapisane do zmiennej
nametypustd::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 Kowalskaw
namelą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 typustd::string,"!\n"– kolejny napis, gdzie\noznacza 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ść:
Deklaracja zmiennej tekstowej:
std::string name;Program przygotowuje zmienną
namena przechowanie imienia użytkownika.Wyświetlenie pytania:
std::cout << "What is your name? ";Użytkownik widzi na ekranie pytanie i kursor czekający na wpisanie odpowiedzi.
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 doname.Przywitanie użytkownika z użyciem podanego imienia:
std::cout << "Hello, " << name << "!\n";Program wypisuje powitanie, „doklejając” wartość zmiennej
namedo 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.
Wygoda –
std::stringwspółpracuje zgetline,std::cout,std::cini 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;.
