Consulta sobre la limitacion de usar "cin".

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
DF_SEGA
Mensajes: 3
Registrado: 13/02/2019 6:40 am

Consulta sobre la limitacion de usar "cin".

#1 Mensaje por DF_SEGA » 13/02/2019 7:04 am

Saludos a Todos,

Un Saludo a todos los expertos en C++ del foro, soy DF_SEGA y soy nuevo, acabo de iniciar mi carrera en Ing en Sistemas aca en mi pais y estoy cursando C++ este cuatrimestre.

Estoy realizando un programa para creacion de facturas que contiene los siguientes 3 modulos y uno de ellos tiene 2 sub-modulos
1.Facturar
2.Productos
2.a-Ingresar Productos
2.b-Mostrar Productos
3.Reporte de Ventas

Estoy en un punto en el que tengo un problema al capturar una variable utilizando "cin", resulta que cree una variable tipo string para almacenar el nombre del producto y cuando el usuario digita el nombre con espacios el programa se encicla, pero si no deja espacios en el nombre el programa sigue funcionando correctamente.

Mi codigo de esa seccion especifica:

Código: Seleccionar todo

	cout << "Ingrese Un Codigo Para el Producto" << endl;
	cin >> codigo;
	cout << "Ingrese Un Nombre Para el Producto" << endl;
	cin >> producto;

Si en nombre del producto se digita por ejemplo "PapasFritas" el programa sigue corriendo, pero si se digita "Papas Fritas" se queda enciclado.

He estado buscando y lo unico que encontre fue en youtube un estudiante que decia que "cin" tiene ciertas limitaciones, pero no he llegado a encontrar literatura sobre eso, casi todo mundo habla y explcia el uso de "printf y scanf" unicamente.

Ambiente de trabado:
Win7 y Win10 con Dev-C++ 5.11

Cualquier ayuda, comentario o direccion a seguir es agradecida!
Última edición por DF_SEGA el 14/02/2019 12:56 pm, editado 1 vez en total.

dehm
Mensajes: 283
Registrado: 29/04/2011 7:31 am

Re: Consulta sobre la limitacion de usar "cin".

#2 Mensaje por dehm » 14/02/2019 10:31 am

Hola:

El problema es que usando cin de esta forma se detiene cuando encuentra un espacio, por lo que vienen los errores.
Una forma de solucionarlo es usando la función http://www.cplusplus.com/reference/stri ... g/getline/

Como viene en el enlace, está sobrecargada y tiene estas dos firmas:

Código: Seleccionar todo

istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
Como dice en la documentación, si no hay errores extrae caracteres del flujo de entrada y los almacena en el string. Esta operación acabará cuando encuentre el delimitador (en el primer caso) o el caracter newline '\n'.

Con eso, este código te puede funcionar:

Código: Seleccionar todo

#include <iostream>

using namespace std;


int main()
{
    string codigo, producto;
    cout << "Ingrese Un Codigo Para el Producto" << endl;
    cin >> codigo;
    cin.ignore();
    cout << "Ingrese Un Nombre Para el Producto" << endl;
    getline(cin, producto);
    cout<<"El producto es: "<<producto<<endl;
    return 0;
}

Unos apuntes. El primer cin, el que pide el código, está hecho usando el operador <<. Si pruebas a poner dos palabras, te dará el error que ya conoces, puesto que dejará de leer en el espacio, y luego lo siguiente que esté almacenado irá a la segunda variable.

Incluso si solo introduces una palabra sin espacios, el caracter '\n' estará ahí, por lo que si no pones el cin.ignore(), será ese caracter el que lea la función getline, provocando su terminación.

Por otro lado, cuando pida el producto, verás que funciona con espacios de por medio.

Obviamente, si "codigo" también puede tener espacios, mejor usar la forma

Código: Seleccionar todo

getline(cin, codigo);
Saludos ;-)
Aprendiendo

DF_SEGA
Mensajes: 3
Registrado: 13/02/2019 6:40 am

Re: Consulta sobre la limitacion de usar "cin".

#3 Mensaje por DF_SEGA » 14/02/2019 12:59 pm

Hola dehm,

Muchas gracias por tomarte el tiempo y ayudarme y explicarme tan bien, voy hacer los cambios que me recomiendas y te cuento como me va!!
Una vez mas muchas gracias!!

Saludos
DF_SEGA

DF_SEGA
Mensajes: 3
Registrado: 13/02/2019 6:40 am

Re: Consulta sobre la limitacion de usar "cin".

#4 Mensaje por DF_SEGA » 20/02/2019 6:57 am

Hola dehm,

En efecto logre resolver el problema con la solucion que me diste, te cuento que busque mas datos sobre getline y cin.ignore para poder entender lo que hacen bien y no solo usarlos porque soluciona mi problema sin entender correctamente el porque lo estoy usando,

Muchas gracias por la ayuda y la orientacion! :D

Saludos
DF_SEGA

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Majestic-12 [Bot] y 15 invitados