Pregunta

Estoy tratando de recopilar la entrada del usuario en una variable de cadena que acepta espacios en blanco para una determinada cantidad de tiempo.

Desde el cin >> str habitual no acepta espacios en blanco, por lo que me gustaría ir con std :: getline de

Aquí está mi código:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local); // This simply does not work. Just skipped without a reason.
        //............................
    }

    //............................
    return 0;
}

¿Alguna idea?

¿Fue útil?

Solución

Se puede ver por qué esto está fallando si lo salida de lo almacenado en la local (que es un nombre de variable pobres, por cierto: P):

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

Usted verá que imprime una nueva línea después de > inmediatamente después de introducir su número. A continuación se pasa a introducir el resto.

Esto se debe a getline le está dando la línea de vacío sobrante de introducir su número. (Se lee el número, pero al parecer no elimina el \n, por lo que uno se queda con una línea en blanco.) Es necesario deshacerse de cualquier espacio en blanco que queda en primer lugar:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    cin >> ws; // stream out any whitespace
    for(int i = 0; i < n; i++)
    {
        string local;
        getline(cin, local);
        std::cout << "> " << local << std::endl;
    }

    //............................
    return 0;
}

Este funciona como se esperaba.

Fuera de tema, tal vez era sólo para el fragmento en cuestión, pero el código tiende a ser más legible si usted no tiene using namespace std;. En contra del propósito de espacios de nombres. Sospecho que era sólo para publicar aquí, sin embargo.

Otros consejos

Declarar un personaje a entrar en el carro de retorno después de haber tecleado en el number.char ws;int n;cin>>n;ws=cin.get(); Esto va a resolver el problema.

  

El uso de cin>>ws en lugar de ws=cin.get(), hará que el primer carácter de la cadena de estar en ws variables, en lugar de simplemente '\n' limpieza.

¿Está oprimir la tecla Enter? Si no conseguir la línea volverá nada, ya que está a la espera de fin de línea ...

Mi conjetura es que usted no está leyendo n correctamente, por lo que es la conversión como cero. Desde 0 no es menor que 0, el bucle no se ejecuta.

Me gustaría añadir un poco de instrumentación:

int n;
cin >> n;
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation
for // ...
  • ¿Está n inicializado correctamente desde la entrada?
  • Usted no parece estar haciendo nada con getline. ¿Es esto lo que quieres?
  • getline devuelve una referencia de istream. El hecho de que usted está cayendo en el asunto suelo?

En qué compilador usted intentó esto? He intentado en VC2008 y funcionó bien. Si Compilé el mismo código en g ++ (GCC) 3.4.2. No funcionó correctamente. A continuación se muestra las versiones trabajado en ambos compiladores. Yo 't No tengo la última g ++ Compiler en mi entorno.

int n;
cin >> n;
string local;
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
for (int i = 0; i < n; i++)
{
    getline(cin, local);
    cout << local;
}

La pregunta importante es "¿qué haces con la cadena que le da la idea de que la entrada se ha omitido?" O, más exactamente, "¿por qué cree la entrada se ha omitido?"

Si usted está caminando a través del depurador, ¿se compila con optimización (que se le permite cambiar el orden de las instrucciones)? No creo que este es su problema, pero es una posibilidad.

Creo que es más probable que la cadena está poblada pero no está siendo manejado correctamente. Por ejemplo, si desea pasar la entrada a las funciones de edad (por ejemplo, C., atoi()), tendrá que extraer la cadena estilo C (local.c_str()).

Puede utilizar directamente la función getline en cadena utilizando delimitador de la siguiente manera:

#include <iostream>
using namespace std;
int main()
{
    string str;
    getline(cin,str,'#');
    getline(cin,str,'#');
}

puede introducir str tantas veces como se desee, pero con una condición se aplica aquí es que necesita para aprobar '#' (tercera argumento) como delimitador es decir, la cadena va a aceptar la entrada hasta la '#' se ha pulsado independientemente del carácter de nueva línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top