Home > other >  C program skipping sentences
C program skipping sentences

Time:12-05

I have 4 structs:

typedef struct personaje{
    cadena_personaje nombre_personaje;
    char sexo;
    int vidas, danio, magia, nivel;
}personaje;

typedef struct vector_personajes{
    personaje personajes[5];
    int contador;
}vector_personajes;

typedef struct fecha{ 
    int dia, mes, anio;
}fecha;

typedef struct videojuego{
    vector_personajes vp;
    fecha fecha_juego;
    cadena_juego titulo_juego;
    char genero;
    int id, niveles;
    char multijugador;    
}videojuego;

personajes contains the main features of the video game characters which are: the name cadena_personaje nombre_personaje, the sex char sexo and 4 int data types that represent the health, damage, magic and max level of it int vidas, danio, magia, nivel

vector_personajes contains an array size 5 of personajes personaje personajes[5] and a counterint contador that keeps track of the number of characters that video game has (max 5).

fecha contains 3 integers which represent a date, day, month and year. int dia, mes, anio.

videojuego contains the main characteristics of the video game, which are: the name of the video game cadena_juego titulo_juego, the release date fecha fecha_juego, the characters it has vector_personajes vp, the genre char genre which can be, action, rol, simulation..etc., the number of levels it has int niveles, the product id of the game (from a store perspective) int id and the possibility of playing multiplayer char multijugador which can be si/no (yes or no)

I have a void introducir(&v) method which, given a video game, reads all the elements needed to describe the actual video game.

void introducir(videojuego &v){
    int fecha, cont;
    bool correcto=false;
    //juego
    cout<<"Introduce el titulo del videojuego: ";
    cin.get(v.titulo_juego,60);
    cout<<"Introduce el id: ";
    cin>>v.id;
    cout<<"Introduce el genero ";
    while (!correcto){
        cin>>v.genero;
        switch (v.genero)
        {
        case 'a':
            correcto=true;
            break;
        case 'r':
            correcto=true;
            break;
        case 'e':
            correcto=true;
            break;
        case 's':
            correcto=true;
            break;
        case 'd':
            correcto=true;
            break;
        default:
            cout<<"El genero es incorrecto, por favor vuelva a introducrilo: ";
            break;
        }
    }
    correcto=false;
    cout<<"Introduce el numero de personajes: ";
    cin>>v.vp.contador;
    cout<<"Hola";//intento ver donde está el fallo
    for (int i = 1; i <= v.vp.contador; i  ){
        cout<<"Introduce el nombre del personaje "<<i<<" :";
        cin.get(v.vp.personajes[i].nombre_personaje,40);
        cout<<"Introduce las vidas del personaje "<<i<<" :";
        cin>>v.vp.personajes[i].vidas;
        cout<<"Introduce el danio maximo que puede hacer el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].danio;
        cout<<"Introduce el nivel maximo al que puede llegar el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].nivel;
        cout<<"Introduce sexo del personaje "<<i<<" :";
        correcto=false;
        /*while (!correcto){
            cin>>v.vp.personajes[i].sexo;
            if (v.vp.personajes[i].sexo=='H'||v.vp.personajes[i].sexo=='h'||v.vp.personajes[i].sexo=='m'||v.vp.personajes[i].sexo=='M'){
                correcto=true;
            }
            else{
                cout<<"hola: ";
            }
        }*/
        correcto=false;
        cout<<"Introduce la magia del personaje "<<i<<" :";
        cin>>v.vp.personajes[i].magia;
    }
}

The problem is that when I execute the introducir(&v) method, it gets to the for ok, but once inside it, the only instructions that the program reads are the couts.

I just don't know what to do. I would really appreciate if anyone could copy and paste my code, compile and run it, and try to figure out what's happening.

Here's the full code:

#include <iostream>

using namespace std;

typedef char cadena_juego[60];
typedef char cadena_personaje[41];

typedef struct personaje{
    cadena_personaje nombre_personaje;
    char sexo;
    int vidas, danio, magia, nivel;
}personaje;

typedef struct vector_personajes{
    personaje personajes[5];
    int contador;
}vector_personajes;

typedef struct fecha{ 
    int dia, mes, anio;
}fecha;

typedef struct videojuego{
    vector_personajes vp;
    fecha fecha_juego;
    cadena_juego titulo_juego;
    char genero;
    int id, niveles;
    char multijugador;    
}videojuego;

void introducir(videojuego &v){
    int fecha, cont;
    bool correcto=false;
    //juego
    cout<<"Introduce el titulo del videojuego: ";
    cin.get(v.titulo_juego,60);
    cout<<"Introduce el id: ";
    cin>>v.id;
    cout<<"Introduce el genero ";
    while (!correcto){
        cin>>v.genero;
        switch (v.genero)
        {
        case 'a':
            correcto=true;
            break;
        case 'r':
            correcto=true;
            break;
        case 'e':
            correcto=true;
            break;
        case 's':
            correcto=true;
            break;
        case 'd':
            correcto=true;
            break;
        default:
            cout<<"El genero es incorrecto, por favor vuelva a introducrilo: ";
            break;
        }
    }
    correcto=false;
    cout<<"Introduce el numero de personajes: ";
    cin>>v.vp.contador;
    cout<<"Hola";//intento ver donde está el fallo
    for (int i = 1; i <= v.vp.contador; i  ){
        cout<<"Introduce el nombre del personaje "<<i<<" :";
        cin.get(v.vp.personajes[i].nombre_personaje,40);
        cout<<"Introduce las vidas del personaje "<<i<<" :";
        cin>>v.vp.personajes[i].vidas;
        cout<<"Introduce el danio maximo que puede hacer el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].danio;
        cout<<"Introduce el nivel maximo al que puede llegar el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].nivel;
        cout<<"Introduce sexo del personaje "<<i<<" :";
        correcto=false;
        /*while (!correcto){
            cin>>v.vp.personajes[i].sexo;
            if (v.vp.personajes[i].sexo=='H'||v.vp.personajes[i].sexo=='h'||v.vp.personajes[i].sexo=='m'||v.vp.personajes[i].sexo=='M'){
                correcto=true;
            }
            else{
                cout<<"hola: ";
            }
        }*/
        correcto=false;
        cout<<"Introduce la magia del personaje "<<i<<" :";
        cin>>v.vp.personajes[i].magia;
    }
}

int main(){
    videojuego v;
    introducir(v);
    return 0;
}

CodePudding user response:

cin.get() only reads one char, which in this case is the \n left behind by the previous operator>>. Try using cin.ignore() before the cin.get(), like this:

for (int i = 1; i <= v.vp.contador; i  ){
        cout<<"Introduce el nombre del personaje "<<i<<" :";
        cin.ignore();
        cin.get(v.vp.personajes[i].nombre_personaje,40);
        cout<<"Introduce las vidas del personaje "<<i<<" :";
        cin>>v.vp.personajes[i].vidas;
        cout<<"Introduce el danio maximo que puede hacer el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].danio;
        cout<<"Introduce el nivel maximo al que puede llegar el personaje "<<i<<" :";
        cin>>v.vp.personajes[i].nivel;
        cout<<"Introduce sexo del personaje "<<i<<" :";

CodePudding user response:

My programming teacher answered my e-mail with the solution. What's happening is that the cin.get()is not working right. The input buffer keeps data and takes it into other fields. What I gotta do is reading cin() (not being able to read plan spaces anymore but

  • Related