Hola a todos estoy haciendo una programación de asignación de datos estructurados y creo que entiendo cómo las estructuras de trabajo.

Estoy tratando de leer en una lista de nombres de los estudiantes, IDENTIFICACIÓN de números (Números), y sus saldos.

Cuando puedo compilar mi aunque el código, se va a leer todo en la primera vez, pero la segunda vez alrededor del bucle y cada vez, se le pedirá el nombre de usuario, pero omite la getline y va directamente a Un Número y Un número de entrada.

Cualquier ayuda se agradece. Tratando de averiguar cómo hacer que el getline de trabajo cada vez que el bucle va alrededor.

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main(){
    const int maxStudents = 30;
    struct Students{
        string studentName;
        int aNumber;
        double outstandingBalance;};

    Students students[maxStudents];

    for(int count = 0; count < maxStudents-1; count++)
    {
        cout<<"Student Name:";
                cin.ignore();
        getline(cin,students[count].studentName);
        cout<<"\nA-Number:";
        cin>>students[count].aNumber;
        if(students[count].aNumber == -999)
            break;
        cout<<"\nOutstanding Balance:";
        cin>>students[count].outstandingBalance;
    }

    cout<<setw(20)<<"A-Number"<<"Name"<<"Balance";

    for(int count2 = 29; count2 >= maxStudents-1; count2--)
        cout<<setw(20)<<students[count2].aNumber<<students[count2].studentName<<students[count2].outstandingBalance;


    system("pause");
    return 0;
}
  • no puedes simplemente usar cin>>students[count].studentName;. Funciona btw
  • no se si el nombre del estudiante tiene un espacio, como ‘John Hancock’ hace.
InformationsquelleAutor sircrisp | 2012-02-01

4 Comentarios

  1. 3

    La razón de lo que estás haciendo no funciona es que el ‘>>’ los operadores de la
    primera vez a través de no extraer el final '\n', el siguiente getline
    ve, y vuelve inmediatamente con una línea vacía.

    La respuesta es simple: no mezclar getline y >>. Si la entrada es
    línea orientada, uso getline. Si usted necesita analizar los datos en la línea de
    el uso de >>, el uso de la cadena leída por getline para inicializar un
    std::istringstream, y el uso >> en él.

    • Entiendo lo que hice mal, pero el resto de su respuesta me ha dejado completamente confundido en cuanto a qué estás tratando de decirme que hacer.
    • He utilizado un cin.ignore(); antes de getline para solucionar mi problema.
    • Crear un std::istringstream de la std::string que contiene la línea de lectura. Usted puede entonces exctract espacio separado los elementos de la secuencia de la misma manera que con std::cin: istr >> item;
    • Bueno! Gracias por la sugerencia. No se puede utilizar para este programa en particular, aunque debido a los requisitos de la tarea. Tiene que ser una cadena.
    • Lo que tiene que ser una cadena? La mezcla de getline y >> es no es una buena técnica. Es extremadamente frágil, y causa todo tipo de problemas inesperados en la entrada. La única solución viable es el uso de getline después de cada pregunta; cuando se necesita un int o un double, colocar la línea (que debe tener el tipo de std::string) en un std::istringstream, y el uso >> en que.
    • con respecto a la ignore: no es tan robusto como el solo uso de getline, pero si tienes que ir por esa ruta, el ignore debe seguir el >>, no preceden a la getline. La idea es asegurar que después de cada entrada, el último personaje extraído es el '\n'.
    • También: comprobar el estado de la corriente después de cada entrada. Su código se comporta muy divertido, si alguien entradas "abc" cuando se debe introducir un número. (Esta es, de hecho, una de las principales ventajas de la getline/istringstream enfoque. El error en estos casos será en el istringstream, que es local en el bucle. Y sin importar lo que suceda, la entrada principal se mantiene sincronizada en las líneas).

  2. 0

    El problema es con la mezcla de cin y getline. Formato de entrada (con el >> operador) y de formato de entrada (getline es un ejemplo) no juegan bien juntos. Definitivamente usted debería leer más sobre esto. Haga clic aquí para obtener más explicación.

    Aquí está la solución a su problema.
    cin.ignore(1024, '\n'); es la clave.

    for(int count = 0; count < maxStudents-1; count++)
    {
        ...
        cout<<"\nOutstanding Balance:";
        cin>>students[count].outstandingBalance;
        cin.ignore(1024, '\n');
    }

Dejar respuesta

Please enter your comment!
Please enter your name here