Wstęp
Ten artykuł opisuje, jak wstawić wartości zmiennych do tekstu przy użyciu biblioteki standardowej C/C++. Należy zauważyć, że C++ nie jest pod tym względem zbyt intuicyjny. W przeciwieństwie do niektórych języków, C++ nie pozwala łatwo łączyć wszystkiego ze wszystkim:
#include <iostream>
int main()
{
int a = 2;
std::cout << "Wartosc zmiennej to: " + a;
}
Tak można by było to zapisać, gdyby C++ był tak intuicyjny, jak co niektóre języki. Efekt jest zupełnie inny od zamierzonego
rtosc zmiennej to:
Tekst + liczba nie dopisuje liczby do tekstu. Tekst jest tu typu
const char*, czyli wskaźnikowego, zatem do adresu tekstu jest dodawana liczba, co sprawia, że tekst nie jest wyświetlany od początku. Intuicyjne?
Ten przykład jest akurat banalny do poprawienia. Wystarczy skorzystać z możliwości przekazania do strumienia
std::cout wielu elementów, zamiast kombinować z łączeniem zmiennych z tekstem
#include <iostream>
int main()
{
int a = 2;
std::cout << "Wartosc zmiennej to: " << a;
}
Wartosc zmiennej to: 2
Tu zdziwienia nie powinno być. W końcu ten zapis jest znany od pierwszych lekcji kursu C++ ;) Problem pojawia się dopiero wtedy, gdy faktycznie potrzebujemy połączyć zmienne z tekstem, by przekazać je, jako całość, do jakiejś funkcji. Zapis z operatorem
<< nie działa poza strumieniami.
std::ostringstream
std::ostringstream to typ strumienia zdefiniowany w nagłówku
<sstream>. Na zmiennych tego typu można operować jak na
std::cout. Różnica miedzy nimi polega na tym, że wrzucane do
std::ostringstram dane nie są nigdzie wyświetlane, ale możemy je potem wyciągnąć w formie tekstu, ze wszystkim, co do strumienia wrzuciliśmy. Służy do tego metoda
str(), zwracająca typ
std::string.
#include <iostream>
#include <string>
#include <sstream>
int main()
{
int a = 2;
std::ostringstream oss;
oss << "Wartosc zmiennej to: " << a;
std::cout << oss.str();
}
Wartosc zmiennej to: 2
std::to_string() (C++11)
Jeśli posiadamy nowszy kompilator, możemy się cieszyć dobrodziejstwami najnowszego standardu języka C++, do których należy funkcja
std::to_string(). Konwertuje ona wartość dowolnego typu wbudowanego do typu
std::string, a tekst tego typu można już łączyć operatorem
+:
#include <iostream>
#include <string>
int main()
{
int a = 2;
std::cout << "Wartosc zmiennej to: " + std::to_string( a );
}
Wartosc zmiennej to: 2
sprintf()
Rozwiązaniem z biblioteki standardowej C, służącym do łączenia zmiennych z tekstem, jest funkcja
sprintf(). Tym się różni od funkcji
printf(), że przed format string został wciśnięty dodatkowy argument - adres bufora, do którego funkcja będzie wpisywać dane.
#include <iostream>
#include <cstdio>
int main()
{
int a = 2;
char buf[ 256 ];
sprintf( buf, "Wartosc zmiennej to: %d", a );
std::cout << buf;
}
Wartosc zmiennej to: 2
Funkcja sprintf() nie jest zabezpieczona przed przepełnieniem bufora. Upewnij się, że bufor jest wystarczająco duży, lub użyj bezpieczniejszego snprintf() (starsze kompilatory mogą nie wspierać tej funkcji). |