Q:

Mostrar texto con Espacio | Principiante | C++

Un saludo,
Estoy realizando un ejercicio en c++, estoy comenzando pero tengo un problema, cuando deseo mostrar dos textos conactenados si el segundo texto contiene espacios solo me muestra el texto hasta antes del espacio, por ejemplo: string a = "hola "; string b = "como estas"; si deseo hacer un cout << a + b; o cout << a << b; el output sería //Hola como
Obviamente me gustaría resolver el problema para que se muestre el texto completo pero más allá me gustaría entender por qué ocurre. A continuación el código.

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main()
{
    int i = 4;
    double d = 4.0;
    string s = "HackerRank ";

    int a;
    double b;
    string c;

    cin >> a;
    cin >> b;
    cin >> c;

    cout << i + a << "\n";

    cout << d + b << "\n";

    cout << s + c;

    return 0;
}

A:

Es simple, la función cin tiene como limite de lectura los espacion o saltos de linea, por ende, si escribes "Hola como" en la entrada de la terminar, cin solo almacenara "Hola", para leer cadenas pasando ese parametro puedes usar la función getline(cin, variable, limite) , donde cin es la entrada estandar de la terminarl o puedes usar un flujo (ifstream), variable es la variable tipo string donde se almacenara el valor leido y limite es el caracter que tomara en cuenta para finalizar la lectura (por ejemplo si pones '\n', leera todo hasta que encuentre un salto de linea (precionar enter)).
De modo que tu código quedaría así
#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main()
{
    int i = 4;
    double d = 4.0;
    string s = "HackerRank ";

    int a;
    double b;
    string c;

    cin >> a;
    cin >> b;
    cin.ignore();
    getline(cin, c, '\n');

    cout << i + a << "\n";

    cout << d + b << "\n";

    cout << s + c;

    return 0;
}

Solo se sustituye el cin de la lectura del string por getline y usamos cin.ignore() para vaciar el buffer antes de leer la cadena.(esto porque al intentar leer una cadena despues de haber leido numeros se auto rellena la cadena con los valores basura del buffer)

