Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kisk en 28 Febrero 2014, 18:20 pm



Título: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: kisk en 28 Febrero 2014, 18:20 pm
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


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: do-while en 28 Febrero 2014, 18:33 pm
¡Buenas!

El problema no está en esa función, está en main:
Código
  1. cout<<"Numero de elementos"<<endl;
  2. cin>>n;
  3.  

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
  1. while(cin.get() != '\n');
  2.  

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!


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: patilanz en 28 Febrero 2014, 20:09 pm
Hola utilizo el mensaje de do-while para preguntar aqui:
Citar
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.
Cual es la diferencia ?

Saludos


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: leosansan en 28 Febrero 2014, 21:46 pm

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
  1. #include<iostream>
  2. #include<cstring>
  3.  
  4. using namespace std;
  5.  
  6. struct pro{
  7.  string codigo;
  8.  string nombre;
  9.  string descripcion;
  10.  string laboratorio;
  11.  double precio;
  12.  double iva;
  13.  int existencia;
  14.  };
  15.  
  16. void leer(struct pro *apt)
  17. {
  18.  double IVA = 0.16;
  19.  double total;
  20.  cout<<"Teclea el Codigo "<<endl;
  21.  getline (cin,apt->codigo);///YA PASA POR AQUI
  22.  cout<<"Nombre "<<endl;
  23.  getline (cin,apt->nombre);
  24.  cout<<"Descripcion: "<<endl;
  25.  getline (cin,apt->descripcion);
  26.  cout<<"Laboratorio: "<<endl;
  27.  getline(cin,apt->laboratorio);
  28.  cout<<"Precio: "<<endl;
  29.  cin>>apt->precio;
  30.  total=(apt->precio*IVA);
  31.  apt->iva=total;
  32.  cout<<"Cuantos hay en existencia"<<endl;
  33.  cin>>apt->existencia;
  34. }
  35.  
  36.  
  37. void imprimir(struct pro *ap)
  38. {
  39.  cout<<" CODIGO:      "<<ap->codigo<<endl;
  40.  cout<<" NOMBRE:      "<<ap->nombre<<endl;
  41.  cout<<" DESCRIPCION: "<<ap->descripcion<<endl;
  42.  cout<<" LABORATORIO: "<<ap->laboratorio<<endl;
  43.  cout<<" PRECIO:      "<<ap->precio<<endl;
  44.  cout<<" IVA:         "<<ap->iva<<endl;
  45.  cout<<" EXISTENCIA:  "<<ap->existencia<<endl;
  46. }
  47. int main ()
  48. {
  49.  int n=0;
  50.  pro * apt=0;
  51.  cout<<"Numero de elementos"<<endl;
  52.  cin>>n;
  53.  cin.get();/// <== AQUI ///
  54.  apt= new pro[n];
  55.  for(int i=0;i<n;i++)
  56.   leer(&apt[i]);
  57.  for(int j=0;j<n;j++)
  58.   imprimir(&apt[j]);
  59.  
  60.  delete [] apt ;
  61.  return 0;
  62. }
  63.  

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

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: vangodp en 28 Febrero 2014, 22:30 pm
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>
Citar
si manejas cadenas tipo C utiliza cstring.
Eso es una cosa que no sabia usaba stdio.h :D
Gracias do-while


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: rir3760 en 1 Marzo 2014, 01:51 am
#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 (http://web.archive.org/web/20060620000029/http://www.dinkumware.com/manuals/)

Un saludo


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: vangodp en 1 Marzo 2014, 11:43 am
Una pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
¿O también sirve para cout?


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: rir3760 en 1 Marzo 2014, 14:23 pm
Una pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
No. Antes de utilizar esas dos funciones debes incluir <cstdio> (http://www.cplusplus.com/reference/cstdio/).

¿O también sirve para cout?
Para utilizar cin, cout (http://www.cplusplus.com/reference/iostream/cout/) y cerr primero debes incluir <iostream>.

Un saludo


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: kisk en 1 Marzo 2014, 19:02 pm
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


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: do-while en 2 Marzo 2014, 21:43 pm
XD

Mira, haz este experimento:

Código
  1. string cad;
  2. int n;
  3.  
  4. cin >> n;
  5.  
  6. getline(cin, cad);
  7.  
  8. cout << n << endl;
  9.  
  10. cout << cad;
  11.  

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!


Título: Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
Publicado por: kisk en 9 Marzo 2014, 03:06 am
XD

Mira, haz este experimento:

Código
  1. string cad;
  2. int n;
  3.  
  4. cin >> n;
  5.  
  6. getline(cin, cad);
  7.  
  8. cout << n << endl;
  9.  
  10. cout << cad;
  11.  

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!
muchas gracias lo e entendido gracias a todos!