Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?

Iniciado por kisk, 28 Febrero 2014, 18:20 PM

0 Miembros y 1 Visitante están viendo este tema.

kisk

Hola Miren tengo este problema paso la direccion del arreglo d eestructuras para q leea el primer elemento que es codigo(variable de tipo string) pero se va directamente a leer el nombre y no me deja ingresar el codigo  aqui el code q para mi esta bien y es problema del getline podrian echarme una mano ??

#include<iostream>
#include<string.h>

using namespace std;

struct pro{
       string codigo;
       string nombre;
       string descripcion;
       string laboratorio;
       double precio;
       double iva;
       int existencia;
       };

void leer(struct pro *apt)
{
  double IVA = 0.16;
  double total;
      cout<<"Teclea el Codigo "<<endl;
    getline (cin,apt->codigo);/////NO PASA POR AQUI POR LO VISTO
    cout<<"Nombre "<<endl;// PASA DIRECTAMENTE A INGRESAR EL NOMBRE Y EL CODIGO SE LO PASA POR LO HUEV..S
    getline (cin,apt->nombre);
    cout<<"Descripcion: "<<endl;
    getline (cin,apt->descripcion);
    cout<<"Laboratorio: "<<endl;
    getline(cin,apt->laboratorio);
    cout<<"Precio: "<<endl;
    cin>>apt->precio;
    total=(apt->precio*IVA);
    apt->iva=total;
    cout<<"Cuantos ay en existencia"<<endl;
    cin>>apt->existencia;

}


void imprimir(struct pro *ap)
{
cout<<" CODIGO:      "<<ap->codigo<<endl;
cout<<" NOMBRE:      "<<ap->nombre<<endl;
cout<<" DESCRIPCION: "<<ap->descripcion<<endl;
cout<<" LABORATORIO: "<<ap->laboratorio<<endl;
cout<<" PRECIO:      "<<ap->precio<<endl;
cout<<" IVA:         "<<ap->iva<<endl;
cout<<" EXISTENCIA:  "<<ap->existencia<<endl;
}
int main ()
{
     int n=0;
     pro * apt=0;

cout<<"Numero de elementos"<<endl;
cin>>n;
apt= new pro[n];
for(int i=0;i<n;i++)
{
leer(&apt);
}
for(int j=0;j<n;j++)
{
imprimir(&apt[j]);
}

     delete [] apt ;
    return 0;
}

Saludos Gracias ;D
La vieja escuela me da nostalgia la nueva me da naucias dime cual es la escuela si ambas me deprimen (8)

do-while

¡Buenas!

El problema no está en esa función, está en main:
Código (cpp) [Seleccionar]

cout<<"Numero de elementos"<<endl;
cin>>n;


Despues de leer el dato queda, un \n en el flujo de entrada (al menos uno, si después del numero introduces cualquier texto o cosa que se te ocurra también quedara eso).

Después de leer el entero tienes que terminar de leer la línea para luego poder leer datos de forma fiable. Tendrás que hacer algo así:
Código (cpp) [Seleccionar]

while(cin.get() != '\n');


Por cierto. En C++ no uses nunca string.h. No sabremos si te refieres a la ce C o a la de C++. Si quieres utilizar cadenas tipo C++ incluye string y si manejas cadenas tipo C utiliza cstring.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

patilanz

Hola utilizo el mensaje de do-while para preguntar aqui:
CitarPor cierto. En C++ no uses nunca string.h. No sabremos si te refieres a la ce C o a la de C++. Si quieres utilizar cadenas tipo C++ incluye string y si manejas cadenas tipo C utiliza cstring.
Cual es la diferencia ?

Saludos

leosansan


Para cuando postees el código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Como ya te indicó do-while el problema está en un '\n' que queda en el bufffer. En este caso con un simple cin.get() te lo "comes".

Código (cpp) [Seleccionar]

#include<iostream>
#include<cstring>

using namespace std;

struct pro{
  string codigo;
  string nombre;
  string descripcion;
  string laboratorio;
  double precio;
  double iva;
  int existencia;
  };

void leer(struct pro *apt)
{
  double IVA = 0.16;
  double total;
  cout<<"Teclea el Codigo "<<endl;
  getline (cin,apt->codigo);///YA PASA POR AQUI
  cout<<"Nombre "<<endl;
  getline (cin,apt->nombre);
  cout<<"Descripcion: "<<endl;
  getline (cin,apt->descripcion);
  cout<<"Laboratorio: "<<endl;
  getline(cin,apt->laboratorio);
  cout<<"Precio: "<<endl;
  cin>>apt->precio;
  total=(apt->precio*IVA);
  apt->iva=total;
  cout<<"Cuantos hay en existencia"<<endl;
  cin>>apt->existencia;
}


void imprimir(struct pro *ap)
{
  cout<<" CODIGO:      "<<ap->codigo<<endl;
  cout<<" NOMBRE:      "<<ap->nombre<<endl;
  cout<<" DESCRIPCION: "<<ap->descripcion<<endl;
  cout<<" LABORATORIO: "<<ap->laboratorio<<endl;
  cout<<" PRECIO:      "<<ap->precio<<endl;
  cout<<" IVA:         "<<ap->iva<<endl;
  cout<<" EXISTENCIA:  "<<ap->existencia<<endl;
}
int main ()
{
  int n=0;
  pro * apt=0;
  cout<<"Numero de elementos"<<endl;
  cin>>n;
  cin.get();/// <== AQUI ///
  apt= new pro[n];
  for(int i=0;i<n;i++)
   leer(&apt[i]);
  for(int j=0;j<n;j++)
   imprimir(&apt[j]);

  delete [] apt ;
  return 0;
}


¡¡¡Que diferencia con las etiquetas Code!!!.

¡¡¡¡ Saluditos! ..... !!!!



vangodp

me pregunto lo mismo que patilanz XD
¿Para que quieres usar strings.h, no es de c?
para cpp es iostram :/
y en todo caso es string sin la .h
#include <string>
Citarsi manejas cadenas tipo C utiliza cstring.
Eso es una cosa que no sabia usaba stdio.h :D
Gracias do-while

rir3760

Cita de: vangodp en 28 Febrero 2014, 22:30 PM#include <string>Eso es una cosa que no sabia usaba stdio.h
En C para utilizar las funciones de entrada/salida (printf, scanf, etc.) primero se debe incluir el encabezado <stdio.h> (<cstdio> en C++), en el caso de las funciones para el manejo de cadenas y memoria (str___ y mem___) el encabezado a incluir es <string.h> (<cstring> en C++).

Un listado de las bibliotecas estándar de C y C++ (C99 y C++98) es Dinkumware Manuals

Un saludo
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

vangodp

Una pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
¿O también sirve para cout?

rir3760

Cita de: vangodp en  1 Marzo 2014, 11:43 AMUna pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
No. Antes de utilizar esas dos funciones debes incluir <cstdio>.

Cita de: vangodp en  1 Marzo 2014, 11:43 AM¿O también sirve para cout?
Para utilizar cin, cout y cerr primero debes incluir <iostream>.

Un saludo
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

kisk

Gracias por sus respuestas ya solucione el error pero sigo sin entender porque le falta un cin.get() osea cuando ago el cin>> n porque queda el "\n" es acaso de q lo toma como el fin de la cadena ?  y ya  cuando voy a poner la string codigo ?lo que lee es el "\n" ? y no me deja ingresar codigo entonces con el cin.get() ya leeo ese "\n" ? que sobra ? asi esta bien ?
Gracias a todos
Salu2s ;D
La vieja escuela me da nostalgia la nueva me da naucias dime cual es la escuela si ambas me deprimen (8)

do-while

XD

Mira, haz este experimento:

Código (cpp) [Seleccionar]

string cad;
int n;

cin >> n;

getline(cin, cad);

cout << n << endl;

cout << cad;


Y cuando toque leer datos escribes un numero y una cadena con lo que se te ocurra.

Veras que te lee el número y luego la cadena. Es decir, después de leer el numero no descarta el resto de la linea que introduzcas, sino que solo descarta el número leído así que después de leer el numero no se quedará esperando a que introduzcas alguna cosa y pulses intro, sino que terminará de leer lo que había, que es lo que pasa en tu programa.

Lo mismo pasaría si utilizases cin para leer una cadena. Solo leería hasta el primer caracter en blanco (un espacio, un tabulador...) y dejaría el resto (esto creo que puedes modificarlo especificando otro delimitador para que cin termine de leer...).

Así que cuando utilices cin, acuérdate siempre de terminar de leer lo que pueda quedar en el flujo de entrada. Como ya sabes que la entrada termina con un \n, lo unico que tienes que hacer es while(cint.get() != '\n');

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!