繁体   English   中英

C++程序跳句

[英]C++ program skipping sentences

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

vector_personajes包含一个大小为 5 的 personajes personaje personajes[5]数组和一个计数器int contador ,用于跟踪视频游戏的字符数(最多 5 个)。

fecha包含 3 个整数,分别代表日期、日期、月份和年份。 int dia, mes, anio .

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(是或否)

我有一个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;
    }
}

问题是,当我执行introducir(&v)方法时,它会到达for ok,但是一旦进入其中,程序读取的唯一指令就是cout

我只是不知道该怎么办。 如果有人可以复制和粘贴我的代码,编译并运行它,并尝试弄清楚发生了什么,我将不胜感激。

这是完整的代码:

#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()只读取一个字符,包括 previos cin 之后的/n 尝试在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<<" :";

我的编程老师用解决方案回复了我的电子邮件。 发生的事情是cin.get()工作不正常。 输入缓冲区保存数据并将其带入其他字段。 我要做的是读取cin() (不能再读取计划空间但是♀️)所以我对缓冲区没有任何问题。

“输入缓冲区保存数据并将其带入其他字段”是我自己的英文翻译为“el buffer de entrada se queda con datos y los toma en los otros campos”,如果有人不明白我在说什么,因为我不明白我真的不知道缓冲区是什么以及它的作用,所以我无法用它来表达自己。 我继续调查那个“缓冲区”。

谢谢大家的答案,! 欣赏,真的!

最终代码如下:

#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