Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: pekfos
Pomoce naukowe

Wstawianie zmiennych do tekstu

[artykuł] Artykuł opisuje, jak wstawiać zmienne do tekstu, przy użyciu biblioteki standardowej C/C++.

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:
C/C++
#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
C/C++
#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.
C/C++
#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 +:
C/C++
#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.
C/C++
#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).