Consulta sobre la limitacion de usar "cin".

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
DF_SEGA
Mensajes: 8
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: 328
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: 8
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: 8
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

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

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

#5 Mensaje por DF_SEGA » 01/03/2019 6:00 pm

Hola a todos nuevamente,

Vuelvo a Preguntar en este mismo tema, por que se me ha presentado un nuevo problema con el uso de "cout" y "cin", les explico.

Cuando corro el codigo y me pide los datos el primer caracter de de la variable tipo string que estoy capturando es obviado y no se imprime, acontinuacion mi codigo y algunas tomas de pantalla.

Les incluyo solo la seccion donde se captura los datos.

Código: Seleccionar todo

void ingresar_datos()
{
	string nomb;
	string ced;
	float sal = 0;
	int op = 0;
	
	//for (int i=0; i<10; i++)
	
	do
	{
		system("CLS");
		cout << "Ingrese Un Nombre" << endl;
		cin.ignore();
		getline(cin,nomb);
		
		cout << "Ingrese Un Numero de Cedula" << endl;
		getline(cin,ced);
		
		cout << "Ingrese Un Salario" << endl;
		cin >> sal;
		
		nombre[pos] = nomb;
		cedula[pos] = ced;
		salario[pos] = sal;
		pos++;
	
		cout << "Desea Ingresar Otro Empleado" << endl;
		cout << "(1) --> Si" << endl;
		cout << "(2) --> No" << endl;
		cin >> op;
		system("CLS");
		
	}while (op != 2);
En la siguiente seccion lo que hago es popular los vectores con los valores capturados en las variables:

Código: Seleccionar todo

	nombre[pos] = nomb;
	cedula[pos] = ced;
	salario[pos] = sal;
	pos++;
Ahora, el programa me pide los datos de forma normal, sin errores, como se muestra en la primera imagen, pero al momento de imprimir en pantalla lo datos capturados siempre el primer caracter de la primera variable tipo string es omitido o eliminado como se muestra en la segunda imagen y no se que estara pasando. Y sucede sin importar de capture 1 o 2 o 3 o todos los valores necesarios.

Cualquier Ayuda se las agradezco!
Saludos
DFSEGA
Adjuntos
Captura1.JPG
Captura1.JPG (22.26 KiB) Visto 768 veces
Captura2.JPG
Captura2.JPG (21.27 KiB) Visto 768 veces

mollok
Mensajes: 516
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

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

#6 Mensaje por mollok » 02/03/2019 4:30 am

Quita el cin.ignore()
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

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

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

#7 Mensaje por DF_SEGA » 05/03/2019 9:22 am

Hola mollok,

Gracias por responder.

Si quito el cin.ignore() vuelvo al problema original por el cual abri este tema, lo raro es que ya habia escrito otro programa simple la semana pasada y no me dio ese error, pero ahora lo esta dando.
Saludos
DF_SEGA

mollok
Mensajes: 516
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

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

#8 Mensaje por mollok » 05/03/2019 11:26 am

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

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

#9 Mensaje por untio » 08/03/2019 3:52 pm

Perdonad si me entrometo, pero en el bucle el cin.ignore funciona mal en la primera iteración porque antes no ha habido ninguna entrada a traves de cin. Supongo que iría mejor poner el cin.ignore al final del bucle, antes del system("cls").

De nuevo os pido perdón si me equivoco. Yo también estoy aprendiendo

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

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

#10 Mensaje por DF_SEGA » 08/03/2019 4:04 pm

mollok escribió:
05/03/2019 11:26 am
Intenta cin.getline( ... )

http://www.cplusplus.com/reference/stri ... g/getline/
Ya lo intente asi, pero el error es el mismo del inicio no captura despues del espacio.

Los mas extraño es que ese problea no lo da con todos los programas que estoy escribiendo, ahorita mismo estoy haciendo otro diferente y no esta generando el error

Voy a seguir haciedo pruebas y les aviso
Saludos
Última edición por DF_SEGA el 08/03/2019 4:06 pm, editado 1 vez en total.

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

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

#11 Mensaje por DF_SEGA » 08/03/2019 4:05 pm

untio escribió:
08/03/2019 3:52 pm
Perdonad si me entrometo, pero en el bucle el cin.ignore funciona mal en la primera iteración porque antes no ha habido ninguna entrada a traves de cin. Supongo que iría mejor poner el cin.ignore al final del bucle, antes del system("cls").

De nuevo os pido perdón si me equivoco. Yo también estoy aprendiendo
Eso no lo he intendado, voy a ver que pasa, no se is funciona, xq leyendo me di cuenta que tiene que ir ante de la captura de string y luego hay una captura de integers.

Saludos

mollok
Mensajes: 516
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

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

#12 Mensaje por mollok » 09/03/2019 1:14 am

Vaciar buffers de entrada es una navaja de doble filo: si un buffer tiene cosas dentro se van a desechar pero si desde un principio está vacío lo que harán estás funciones es esperar a que haya algo, después van a informar ese algo y es entonces cuando permitirán que el programa continúe.

El año pasado encontré una técnica, que todavía no me ha fallado y creo que está publicada en este foro, que es mover el puntero de archivo al final de todo (recordemos que stdin es un archivo, de flujo pero un archivo); con lo que no se bloquea, salta todo cuanto pudiera tener dentro y el buffer está vacío para recibir entradas frescas.

Código: Seleccionar todo

fseek(stdin, 0, SEEK_END);
Es código C, sé que C++ tiene sus propias instrucciones pero las desconozco. Funciona con las librerías de GCC.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados