Ver Mensaje Individual
  #14 (permalink)  
Antiguo 28/05/2014, 22:23
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 11 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

Eso se debe a residuos en el buffer.
Algunas funciones dejan el el carácter '\n' enter en el buffer cuando pulsas enter.

cuando por ejemplo pedimos un int y lo guardamos con cin hacemos uso del buffer...¿Y como funciona el buffer?
el bufer es un mecanismo que acumula cadenas de numeros y/o letras hasta que encuentra con el caracter '\n' que no es mas que la tecla enter.

Entonces si tenemos un programa que pide un numero y lo recorre con cin>>numero;

Entramos con por ejemplo el numero 22 y no pasa nada, ese 22 esta en el buffer y realmente aun no ha ido a la variable numero. Es cuando pulsamos el enter que el operador >> envía 22 a numero ¿capiche?XD

El gran problema es que al pulsar enter estamos pulsando un caracter y numero es un int ¿verdad?Supongo que te estaras haciendo la pregunta del millon...¿Y donde demonios esta ese enter? XDD
Pues el enter se queda en el buffer para trollearte... así de claro XD

luego viene nuestra cin.getline() tan maja que espera un enter tambien para dar por concluida la entrada del string y pfff se lo salta asi todas ellas jajaja

¿que no te lo cres? pues te lo demuestro >_<

Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. int main () {
  7.     system ( "MODE CON cols=100 lines=50" );
  8.    
  9.     int num;
  10.     string nombre;
  11.    
  12.     cin >> num;
  13.    
  14.     getline ( cin, nombre );
  15.    
  16.    
  17.     cout << nombre << endl;
  18.     cout << "Si no pide nombre ya te has colado por que num: " << num << ", ya se ha mostrado" << endl;
  19.    
  20.     cin.ignore();
  21.     return 0;
  22. }

El programa ese de arriba tam majo pide un int, y cuando pulsas el enter te pilla un bonito salto ni pide nombre ni imprime na el guapo del getline XD

Pero a cambio si hago eso:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. int main () {
  7.     system ( "MODE CON cols=100 lines=50" );
  8.    
  9.     int num;
  10.     string nombre;
  11.    
  12.     cin >> num;
  13.    
  14.     if ( cin.peek() == '\n' ) {  // Si en el buffer a quedado rastro por pulsar enter '\n'
  15.         cin.ignore ( 1, '\n' ); // Ignoramos ese enter
  16.         cout << "efectivamente habia un enter en el buffer y como bueno que soy te lo he limpiado ya XD"<< endl;
  17.     }
  18.  
  19.     getline ( cin, nombre );
  20.    
  21.    
  22.     cout << "Mi nombre es: "<< nombre << endl;
  23.     cout << "Si no pide nombre ya te has colado por que num: " << num << ", ya se ha mostrado" << endl;
  24.    
  25.     cin.ignore();
  26.     return 0;
  27. }

La función peek() me va decir si tiene un enter metio en el buffer de cin y si lo encuentra el cin.ignore() nos "ignorara" literalmente 1 solo enter.¡bua uno solo=(! ¡¡No!!! Cuantos yo quiera ¿1000 te parece bien?XD cin.ignore ( 1000, '\n' ); Después de eso ya podía haber 1000 enters en el buffer que se lo va pasar por el forro jajaja

Bueno que si jeje, lo que te quiero decir que si usas >> debes liberar el buffer si luego despues vas usar getch, getline... o lo que sea que use buffer XDD con cin.ignore( cantidadDeCaracteresAIgnorar, CaracterAIgnorar); si pongo cin.ignore( 3000, 'a' ) estoy ignorando 3000 letras a. así que si escuchas eso https://www.youtube.com/watch?v=g52DkZRtXQM nos cargamos la letra XDD

Has las pruebas de purgar el buffer y me cuentas ;)
Después de eso te va funcionar todo normal ya lo veras XDDD

Ah!! Diga lo que diga las malas lenguas nunca nunca nunca use fflush() para limpiar el buffer, dice la leyenda que es indomable XDD(tiene comportamiento indefinido), si usas c++ usas funciones de c++ ;).

Enga taluego que sino te aburro jaja

Obs: lo de que ignore limpia el buffer no me tomes a serio XDD solo lo ignora el dichoso enter XD, si quieres limpiarlo hazlo con cin.sync(); que sincroniza el buffer con lo que hemos escrito limpiando todo lo que no hayamos escrito nosotros excluyendo asi el \n.

Última edición por vangodp; 28/05/2014 a las 23:38