简体   繁体   English

C++程序跳句

[英]C++ program skipping sentences

I have 4 structs:我有4个结构:

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 personajes包含视频游戏角色的主要特征,它们是:名称cadena_personaje nombre_personaje 、sex char sexo和 4 个 int 数据类型,代表它的健康、伤害、魔法和最高等级int vidas, danio, magia, nivel

vector_personajes contains an array size 5 of personajes personaje personajes[5] and a counter int contador that keeps track of the number of characters that video game has (max 5). vector_personajes包含一个大小为 5 的 personajes personaje personajes[5]数组和一个计数器int contador ,用于跟踪视频游戏的字符数(最多 5 个)。

fecha contains 3 integers which represent a date, day, month and year. fecha包含 3 个整数,分别代表日期、日期、月份和年份。 int dia, mes, anio . 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, a ction, r ol, s imulation..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 s i/ n o (yes or no) videojuego包含了视频游戏的主要特征,分别是:视频游戏名称cadena_juego cadena_juego titulo_juego ,发布日期fecha fecha_juego vector_personajes vp拥有char genre imulation..etc.,它具有int niveles的级别数,游戏的产品 id(从商店的角度来看) int id以及玩多人char multijugador的可能性,可以是s i/ n o(是或否)

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(&v)方法,给定一个视频游戏,它会读取描述实际视频游戏所需的所有元素。

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 cout s.问题是,当我执行introducir(&v)方法时,它会到达for ok,但是一旦进入其中,程序读取的唯一指令就是cout

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;
}

cin.get() only reads one char INCLUDING the /n after the previos cin. cin.get()只读取一个字符,包括 previos cin 之后的/n Try to write cin.ignore() before those cin.get() like this:尝试在cin.get() cin.ignore() ,如下所示:

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<<" :";

My programming teacher answered my e-mail with the solution.我的编程老师用解决方案回复了我的电子邮件。 What's happening is that the cin.get() is not working right.发生的事情是cin.get()工作不正常。 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 ♀️) so I don't have any problem with the buffer.我要做的是读取cin() (不能再读取计划空间但是♀️)所以我对缓冲区没有任何问题。

"The input buffer keeps data and takes it into other fields" is my own English translation to "el buffer de entrada se queda con datos y los toma en los otros campos" if anyone doesn't understand what im saying given that I don't really know what a buffer and what it does, so I can't really express myself with that. “输入缓冲区保存数据并将其带入其他字段”是我自己的英文翻译为“el buffer de entrada se queda con datos y los toma en los otros campos”,如果有人不明白我在说什么,因为我不明白我真的不知道缓冲区是什么以及它的作用,所以我无法用它来表达自己。 Ima keep investigating about that "buffer".我继续调查那个“缓冲区”。

Thank you all for your answers,!谢谢大家的答案,! Appreciate it, really!欣赏,真的!

Final code is the following:最终代码如下:

#include <iostream>

using namespace std;

#define maxjue 60
#define maxcad 41
#define maxper 5

typedef char cadena_juego[maxjue];
typedef char cadena_personaje[maxcad];

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

typedef personaje v_per [maxper];

typedef struct
{
    v_per personajes;
    int contador;
}vector_personajes;


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

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

void introducir(videojuego &v);

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

void introducir(videojuego &v)
{
    int fecha, cont;
    char aux;

    //juego
    cout<<"Introduce el titulo del videojuego: ";
    cin>>v.titulo_juego;
    cout<<"Introduce el id: ";
    cin>>v.id;
    cout<<"Introduce el genero ";
    cin>>v.genero;
    while (v.genero!='a' && v.genero!='r' && v.genero!='e' && v.genero!='s' && v.genero!='d' )
    {
        cout<<"Genero incorrecto, vuelva a introducir:";
        cin>>v.genero;
    }
    cout<<"Introduce el numero de personajes: ";
    cin>>v.vp.contador;
    cout<<"Hola";//intento ver donde está el fallo
    //en realidad no hay tal fallo, el cin.get no esta funcionando bien
    //el buffer de entrada se queda con datos y los toma en los otros campos
    //lee con cin>> las cadenas para no tener problemas de buffer
    for (int i = 0; i < v.vp.contador; i++)
    {
        cout<<"Introduce el nombre del personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].nombre_personaje;
        cout<<"Introduce las vidas del personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].vidas;
        cout<<"Introduce el danio maximo que puede hacer el personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].danio;
        cout<<"Introduce el nivel maximo al que puede llegar el personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].nivel;
        cout<<"Introduce sexo del personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].sexo;
        while (v.vp.personajes[i].sexo!='H'&& v.vp.personajes[i].sexo !='h'&& v.vp.personajes[i].sexo !='m'&& v.vp.personajes[i].sexo !='M')
        {
            cout<<"Error, Introduce de nuevo sexo del personaje "<<i+1<<" :";
            cin>>v.vp.personajes[i].sexo;
        }
        cout<<"Introduce la magia del personaje "<<i+1<<" :";
        cin>>v.vp.personajes[i].magia;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM