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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?  (Leído 4,062 veces)
kisk

Desconectado Desconectado

Mensajes: 55



Ver Perfil
Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« 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


En línea

La vieja escuela me da nostalgia la nueva me da naucias dime cual es la escuela si ambas me deprimen (8)
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #1 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!


« Última modificación: 28 Febrero 2014, 18:35 pm por do-while » En línea

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


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #2 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
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #3 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! ..... !!!!


En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #4 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
« Última modificación: 28 Febrero 2014, 22:33 pm por vangodp » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #5 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

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
vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #6 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?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #7 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>.

¿O también sirve para cout?
Para utilizar cin, cout y cerr primero debes incluir <iostream>.

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
kisk

Desconectado Desconectado

Mensajes: 55



Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #8 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
En línea

La vieja escuela me da nostalgia la nueva me da naucias dime cual es la escuela si ambas me deprimen (8)
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan?
« Respuesta #9 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!
« Última modificación: 2 Marzo 2014, 21:45 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reclamo contra eternal idol ( como mod de ASM ). « 1 2 3 »
Sugerencias y dudas sobre el Foro
YST 28 9,487 Último mensaje 29 Mayo 2009, 22:47 pm
por el-brujo
EOF con string y getline C++
Programación C/C++
fehnet 3 1,899 Último mensaje 16 Julio 2013, 14:20 pm
por fehnet
Eternal Idol ya que me bloqueaste los mensajes privados, lee esto anda, pero de buen rollo.
Foro Libre
Hason 2 2,358 Último mensaje 19 Mayo 2022, 01:00 am
por Hason
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines