elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  getline() !!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: getline() !!!  (Leído 3,435 veces)
chicainge

Desconectado Desconectado

Mensajes: 15


Ver Perfil
getline() !!!
« en: 13 Septiembre 2014, 16:40 pm »

HOLA, miren tengo un problema con esta programa en el getline() este al introducirle mas de un caracter me mete en un bucle he probado a introducirle un cin.ignore o un cin.get() pero nada sigue teniendo problemas el getline(), alguien que sepa su funcionamiento y me explique que le pasa, Gracias:) :-\ :-\


Código:
/*Se necesita un programa para gestión de una agencia matrimonial. Por cada cliente se
almacenarán los siguientes datos: nombre, edad, sexo (M,F), aficiones (Lectura,
Viajes, Deportes, Cine, Gastronomía, Ordenadores,
JuegosDeRol, Modelismo,Perros). Una persona puede tener ninguna, uno o
más aficiones. Implementar los subalgoritmos que permitan (definir previamente el tipo
de datos adecuado para almacenar esta información):
a) Introducir en la estructura los datos de una persona
b) Buscar una persona (por el nombre)
c) Dar de baja una persona (eliminar sus datos, se localiza por el nombre)
d) Casar. Dado el nombre de una persona, se busca una afín a ella, se presentan
por pantalla sus datos y se eliminan los dos de la base de datos. Una persona
será afín a otra (a efectos de Casar) si coinciden todas sus aficiones.*/

#include<iostream>
#include<string>

using namespace std;

typedef int listaficiones[3];

typedef struct{
  string nombre;
  unsigned edad;
  char sexo;
  listaficiones aficiones;
}cliente;

typedef cliente NClientes[100];

typedef struct {
    unsigned numero_de_clientes;
    NClientes NC;
}TListaClientes;

void inicializar_registro(TListaClientes &);
void menu();
void registrar(TListaClientes &);
bool buscar(string , int&,TListaClientes);
void mostrar(int , TListaClientes);
bool casar(string , TListaClientes &);
bool borrar(string, TListaClientes &);
bool afic_iguales(int, int&, TListaClientes);
void mosafi(int ,int,TListaClientes );

int main(){
    TListaClientes lista;
    string n;
    char c='\n';
    int nr;
    inicializar_registro(lista);
    menu();
    while(c!='E'){
    cin>>c;
    //toupper(c);
    switch(toupper(c)){
      case 'A' :
          registrar(lista);
          cout<<"Persona registrada."<<endl;
          break;
      case 'B' :
          cout<<"Nombre buscado: ";
          getline(cin, n);
          buscar(n,nr,lista);
          mostrar(nr,lista);
          break;
      case 'C' :
        cout<<"Nombre del cliente que desea borrar: ";
        getline(cin, n);
        if (borrar(n,lista)){
            cout<<endl<< "cliente borrardo."<<endl;
        }
        else cout<<"cliente no existe!!"<<endl;
      break;
      case 'D' : cout<<"Nombre del cliente que desea casar: ";
      getline(cin, n);
      if(casar(n,lista)) cout<<"operacion realizada"<<endl;
      else cout<<"afin no encontrado.";
     }
    }
}

void inicializar_registro(TListaClientes &lis){
  lis.numero_de_clientes=0;
}

void menu(){
  cout<<"A.Registrar persona."
  <<endl<<"B.Buscar persona por nombre."
  <<endl<<"C.Eliminar una persona."
  <<endl<<"D.Casar. Hay que dar un nombre."
  <<endl<<"E.Salir."<<endl;

}
void registrar(TListaClientes &l){
        int sexo;
        cout<<"Este es el registro numero"<<l.numero_de_clientes+1<<endl;
        cout<<"NOMBRE: ";
        getline(cin,l.NC[l.numero_de_clientes].nombre);
        //cin.ignore();
        //cin.get();
        cout<<"Sexo, 1.(masculino) 2.(femenino): ";
        cin>>sexo;
        if(sexo==1){
        l.NC[l.numero_de_clientes].sexo='M';
        }
        else l.NC[l.numero_de_clientes].sexo='F';
        cout<<"Edad: ";
        cin>>l.NC[l.numero_de_clientes].edad;
        cout<<"Elige 3 aficiones: "<<endl<<" 1.Lectura "<<endl<<" 2.Viajes "<<endl<<" 3.Deportes "<<endl<<" 4.Cine "<<endl<<" 5.Gastronomía "<<endl<<" 6.Ordenadores "<<endl<<" 7.JuegosDeRol "<<endl<<" 8.Modelismo "<<endl<<" 9.Perros "<<endl;
        for(int j=0; j<3 ;j++){
            cin>>l.NC[l.numero_de_clientes].aficiones[j];
        }
        l.numero_de_clientes++;

}
bool buscar(string nomb,int& i,TListaClientes lista){
   bool a=false;
   for(int j=0;j<lista.numero_de_clientes;j++){
    if(nomb==lista.NC[j].nombre){
        a=true;
        i=j;
    }
   }
   return a;
}
void mostrar(int s,TListaClientes l){
    cout<<endl<<"Nombre: "<<l.NC[s].nombre;
    cout<<endl<<"Sexo: "<<l.NC[s].sexo;
    cout<<endl<<"Edad: "<<l.NC[s].edad;
    cout<<endl<<"Aficiones: "<<endl;
    for(int i=0; i<3; i++){
        mosafi(i,s,l);
    }
}
void mosafi(int af,int s,TListaClientes lista){
    switch(lista.NC[s].aficiones[af]){
      case 1: cout<<"Lectura"<<endl;
      break;
      case 2: cout<<"Viajes"<<endl;
      break;
      case 3: cout<<"Deportes"<<endl;
      break;
      case 4: cout<<"Cine"<<endl;
      break;
      case 5: cout<<"Gastronomía"<<endl;
      break;
      case 6: cout<<"Ordenadores"<<endl;
      break;
      case 7: cout<<"JuegosDeRol"<<endl;
      break;
      case 8: cout<<"Modelismo"<<endl;
      break;
      case 9: cout<<"Perros"<<endl;
    }
}
bool borrar(string n,TListaClientes &l){
    int i;
    bool a;
    a=buscar(n,i,l);
    if(a){
        for(int j=i; j<l.numero_de_clientes ; j++){
            l.NC[j]=l.NC[j+1];
        }
        l.numero_de_clientes--;
    }
    return a;
}
bool casar(string n,TListaClientes &lista){
    bool a,b;
    int i,j,parej;

    a=buscar(n,i,lista);
    if (a){
       a=false;
       for(j=0; j<lista.numero_de_clientes || a==false ; j++){
        if (lista.NC[j].nombre!=n){
          if(afic_iguales(i,j,lista)) parej=j;a=true ;
        }
       }
    }
  return a;
 }
bool afic_iguales(int i, int &j, TListaClientes l){
   bool b=true;
   for(int k=0; k<3 ;k++){
    for(int y=0; y<3 && b==true; y++){
        if(l.NC[i].aficiones[k]!=l.NC[j].aficiones[y]) {
            b=false;
        }
    }
   }
   return b;
}


« Última modificación: 14 Septiembre 2014, 19:34 pm por chicainge » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: getline() !!!
« Respuesta #1 en: 14 Septiembre 2014, 18:00 pm »

tengo un problema con esta programa en el getline() este al introducirle mas de un caracter me mete en un bucle he probado a introducirle un cin.ignore o un cin.get() pero nada sigue teniendo problemas el getline(), alguien que sepa su funcionamiento y me explique que le pasa
Si en un programa se tiene (como es tu caso) un uso intercalado del operador ">>" y getline se presentaran problemas debido a que el operador ">>" solo consume los caracteres validos para la conversión en turno, el primer carácter invalido usualmente es el avance de linea o '\n'. A continuación la función getline procesa el carácter restante (el '\n') como una linea en blanco.

El mentado problema en la función main:
Código
  1. while( c != 'E'){
  2.   cin >> c; // Al menos el '\n' se mantiene en el bufer ...
  3.   switch(toupper(c)){
  4.   // ...
  5.   case 'B' :
  6.      cout<<"Nombre buscado: ";
  7.      getline(cin, n); // ... lee '\n' como una linea en blanco
  8.      buscar(n,nr,lista);
  9.      mostrar(nr,lista);
  10.      break;
  11.   case 'C' :
  12.      cout<<"Nombre del cliente que desea borrar: ";
  13.      getline(cin, n);  // ... lee '\n' como una linea en blanco

Para solucionarlo debes descartar el resto de la linea justo después del uso de ">>" y antes de la llamada a getline, opciones para ello son las funciones ignore y sync, un ejemplo de la primera donde se utiliza un bucle para leer una linea y un carácter:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8.  
  9. #include <limits>
  10. using std::numeric_limits;
  11.  
  12. int main()
  13. {
  14.   string linea;
  15.   char ch;
  16.  
  17.   do {
  18.      cout << "Frase: ";
  19.      getline(cin, linea);
  20.  
  21.      cout << "Continuar? (S/N) ";
  22.      cin >> ch;
  23.      cin.ignore(numeric_limits<int>::max(), '\n');
  24.   }while (ch == 's' || ch == 'S');
  25.  
  26.   return 0;
  27. }

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
chicainge

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: getline() !!!
« Respuesta #2 en: 14 Septiembre 2014, 19:22 pm »

ajaaa!! muchisimas gracias:))
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
getline()
Programación C/C++
Geek7 3 11,863 Último mensaje 29 Julio 2010, 20:52 pm
por Geek7
cin.getline y cin.ignore
Programación C/C++
ricardo2013 6 4,887 Último mensaje 25 Octubre 2012, 17:01 pm
por rir3760
EOF con string y getline C++
Programación C/C++
fehnet 3 2,135 Último mensaje 16 Julio 2013, 14:20 pm
por fehnet
Problema con cin.getline
Programación C/C++
erest0r 8 6,980 Último mensaje 24 Agosto 2013, 03:33 am
por erest0r
Problemas con GetLIne y Threads en c
Programación C/C++
jomoza 2 2,065 Último mensaje 19 Diciembre 2014, 02:16 am
por jomoza
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines