none
No me deja ingresar un dato. No entiendo lo que pasa RRS feed

  • Pregunta

  • Buenas,
    Soy un principiante en esto y tengo un pequeño programa de prueba el cual usaba para conocer un poco el Visual C++ ya que siempre he trabajado con el Borland C++ mi programa de prueba solo me pide ingresar dos datos y luego me los muestra.

     

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    void In_Reg() {
    	char Dat1[10], Dat2[10];
    
    	cout<<"Dat1: ";
    	gets(Dat1);
    	
    	cout<<"Dat2: ";
    	gets(Dat2);
    
    	cout<<"Dat1: "<<Dat1<<endl;
    	cout<<"Dat2: "<<Dat2<<endl;
    }
    
    void main () {
    	int Opc;
    	cout<<"Ingrese la Opcion que desee: ";
    	cin>>Opc;
    
    	In_Reg();
    	getchar();
    }

    Mi idea colocarle un menu para colocar otras opciones, pero al hacerlo me empezo a saltar el ingreso del Dat1 solo me pide ingresar el Dat2. Me di cuenta que al pedir "cin>>Opc;" empezo el problema, pero no entiendo porque si en Borland C++ me funciona bien.

    El resultado al correr el programa es algo asi:
    imagen: http://bit.ly/et031F

     

    Alguien me presta algo de ayuda al respecto? Gracias :)


    lunes, 4 de abril de 2011 17:21

Respuestas

  • Hola Bartomeu, vos que sabés de esto,

    el primer cin no llega a parsear el newline del stream, por lo que lo hace el segundo y salta al tercero. Pregunta, uso cin.ignore(1000000, '\n') luego del primer cin, o existe algo mejor ¿?.

    • Marcado como respuesta AnbuElite miércoles, 6 de abril de 2011 16:03
    miércoles, 6 de abril de 2011 12:30

Todas las respuestas

  • Si vas a trabajar con C++, te recomiendo que te olvides de los arrays de char y que utilices std::string, te ahorrarás muchos problemas ya que te podrás olvidar de la longitud y nunca tendrás desbordamiento del array. En tu caso:

    Añades "#include <string>"

    Cambias "char Dat1[10],Dat2[10]"  por "string Dat1,Dat2"

    Cambias "gets(Dat1)" y "gets(Dat)" por "cin >> Dat1" y "cin >> Dat2"

    Si Dat1 y Dat2 pueden tener espacios, por ejemplo: "Pepito Perez" en vez de "cin >> Dat1" deberás usar "getline(cin,Dat1)"

    miércoles, 6 de abril de 2011 6:11
  • Hola Bartomeu, vos que sabés de esto,

    el primer cin no llega a parsear el newline del stream, por lo que lo hace el segundo y salta al tercero. Pregunta, uso cin.ignore(1000000, '\n') luego del primer cin, o existe algo mejor ¿?.

    • Marcado como respuesta AnbuElite miércoles, 6 de abril de 2011 16:03
    miércoles, 6 de abril de 2011 12:30
  • Hola,

    Bartomeu: Siempre es bueno aprender algo nuevo, gracias.

    Walter Miguel: Gracias, esto solucionó mi problema, según pude leer esto es causado por basura restante en el bufer tras el primer "cin". Aplicando el cin.ignore(); no se toma en cuenta la basura restante, solucionando mi problema.

    miércoles, 6 de abril de 2011 16:12
  • Aunque 1000000 parece un numero lo suficiente grande para que funcione siempre, debes usar cin.ignore(numeric_limits<int>::max()) ya que esta es la manera de decirle a la función que lo ignore todo, incluso si alguien tuviese la paciencia de teclear mas carácteres que max().

    Date cuenta que no he puesto '\n'. Así tambien ignora si el usuario teclea varios retornos de carro y evitas que queden lineas vacias para posteriores entradas.

    Finalmente, el ignore lo debes poner antes del cout que hace la pregunta, no después del cin que recoge la respuesta. Tienes que limpiar el buffer antes de leer lo que quieres, no dejarlo 'limpio' después de leer algo, se podría volver a ensuciar antes de la siguiente pregunta. Algo así como esto:

    const int TODO=numeric_limits<int>::max();

    cin.ignore(TODO); cout>>"pregunta1"; cin >> Respuesta1;

    // todo el código que quieras

    cin.ignore(TODO); cout >>"pregunta2"; cin >> Respuesta2;

    jueves, 7 de abril de 2011 6:31
  • Perfecto. No me había quedado claro lo del segundo argumento del ignore().
    jueves, 7 de abril de 2011 14:24