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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  cin.getline y cin.ignore
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: cin.getline y cin.ignore  (Leído 2,986 veces)
ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
cin.getline y cin.ignore
« en: 25 Octubre 2012, 13:08 pm »

Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char nombre[10] = "";
  9.    int dia = 0;
  10.  
  11.    cin.getline(nombre, 10, '\n');
  12.    cin.ignore(numeric_limits<int>::max(), '\n');
  13.  
  14.    cout << "dia: ";
  15.    cin >> dia;
  16.    cout << "dia: " << dia << endl;
  17.  
  18.    return 0;      
  19. }
  20.  

Compilo y ejecuto:

Código:
[tmp]$ g++ a1.cpp -Wall -g -o a1
[tmp]$ ./a1
hola esto es una prueba con una cadena que ocupa mas de 10 caracteres
dia: dia: 0
[tmp]$

¿Por qué no me pide por pantalla el valor de día?

Gracias de antemano


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #1 en: 25 Octubre 2012, 14:08 pm »

¿Por qué no me pide por pantalla el valor de día?
Por la "basura" que queda en el buffer, entiéndase excesos de caracteres introducidos que hay que eliminar. Como aficionado te propongo esta solución:
Código
  1. #include <iostream>
  2. #include <limits>
  3. #include<stdio.h>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char nombre[10] = "";
  9.    int dia = 0;
  10.    cin.getline(nombre, 10, '\n');
  11.    cin.ignore(numeric_limits<int>::max(), '\n');
  12.    while (getchar ()!='\n');
  13.    cout << "dia: ";
  14.    getchar ();
  15.    cin >> dia;
  16.    cout << "dia: " << dia << endl;
  17.  
  18.    return 0;
  19. }
  20.  
Saludos!.


En línea

ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #2 en: 25 Octubre 2012, 14:33 pm »

Gracias leosansan, pero no soluciona el problema (lo he probado). Según entiendo, cin.getline debería de "eliminar" los datos sobrantes del buffer, pero parece que no funciona. Lo curioso es que el valor que le da a dia es el que tiene por defecto, y no uno cualquier obtenido del buffer. Es como si cin no se ejecutase.

¿A alguien se le ocurre donde puede estar el error?
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #3 en: 25 Octubre 2012, 15:16 pm »

Gracias leosansan, pero no soluciona el problema (lo he probado).
Citar
Es curioso, a mí entrando más de 10 caracteres si me funciona
En línea

ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #4 en: 25 Octubre 2012, 15:26 pm »

Es curioso, a mí entrando más de 10 caracteres si me funciona

Código:
[tmp]$ ./test
hola esto es una prueba
dia: 2
dia: 0

Fijate que sigue impriendo 0, el valor que tiene día por defecto.


Yo sigo leyendo y buscando... si cin.getline llega al número máximo de carácteres sin encontrar el delimitador, activa el flag failbit.


Código
  1. #include <iostream>
  2. #include <limits>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    char nombre[5];
  8.    int dia = 0;
  9.    cin.getline(nombre, 5);
  10.    cin.ignore(numeric_limits<int>::max(), '\n');
  11.    if (cin.fail())
  12.        cout << "fail\n";
  13.    cout << nombre;
  14.    cout << "\ndia: ";
  15.    cin >> dia;
  16.    cout << "el dia es " << dia << endl;
  17.    return 0;
  18. }
  19.  

Código:
[tmp]$ ./dd
hola esto es una prueba
fail
hola
dia: el dia es 0

Fijaros como imprime fail.

He introducido esta línea antes del if(cin.fail())
Código
  1. cin.clear()
  2.  

Ahora NO imprime el fail pero sigue sin funcionar, el cin no lee nada.

Estoy amargado con esto  :(
En línea

ricardo2013

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #5 en: 25 Octubre 2012, 15:52 pm »

Es así

Código
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    char nombre[10] = "";
  9.    int dia = 0;
  10.    cin.getline(nombre, 10, '\n');
  11.    cin.clear();
  12.    cin.ignore(numeric_limits<int>::max(), '\n');
  13.    cout << "dia: ";
  14.    cin >> dia;
  15.    cout << "dia: " << dia << endl;
  16.  
  17.    return 0;
  18. }
  19.  

Primero se desactivan los indicadores de error y después se limpia el buffer con cin.ignore.

Un saludo
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: cin.getline y cin.ignore
« Respuesta #6 en: 25 Octubre 2012, 17:01 pm »

Puedes ahorrarte la llamada a la función "clear" utilizando, en lugar de "getline", la función miembro "get":
Código
  1. cin.get(nombre, 10, '\n');
  2. cin.ignore(numeric_limits<int>::max(), '\n');
  3.  
  4. // ...

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PROBLEMA con la funcion miembro getline() e ignore()
Programación C/C++
.:BlackCoder:. 9 6,095 Último mensaje 27 Julio 2010, 04:29 am
por leogtz
[Solucionado]entrar datos con getline utilizar ignore
Programación C/C++
tonilogar 7 4,375 Último mensaje 26 Mayo 2011, 11:02 am
por tonilogar
Problema con el delimitador de getline [SOLUCIONADO]
Programación C/C++
anonimo12121 3 3,786 Último mensaje 1 Abril 2013, 18:13 pm
por anonimo12121
Como usar cin.ignore()
Programación C/C++
Lotux5 2 8,080 Último mensaje 12 Mayo 2013, 18:46 pm
por rir3760
Problema con cin.getline
Programación C/C++
erest0r 8 4,666 Último mensaje 24 Agosto 2013, 03:33 am
por erest0r
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines