Comunidad de diseño web y desarrollo en internet

Validación de tipos de datos en C++

Estaba aprendiendo un poco de C++ cuando decidí armar un programa que creara gráficos de tortuga. Al empezar a desarrollarlo arme un menú para acceder a las opciones de manera numérica y me tropecé con el problema de validar que el dato introducido fuera de tipo numérico.

Indagando un poco por Internet lo primero que me encontré fue una función para validar la introducción de dígitos: isdigit de la librería ctype.h ó cctype. El problema con dicha función es que, aunque valida el tipo, solo lo hace en caso de ser un dígito, pero no en el caso de ser un número con más de 1 solo dígito.

Leyendo un poco, encontré que tal vez el problema se podía resolver utilizando aritmética binaria y manejo de bits de error de la librería iostream. Encontré este tutorial: Controles de flujo (Parte 2). El tutorial me pareció muy adecuado, pero al probarlo note que era necesario realizar dos Enter para que funcionara de manera adecuada.

El problema del Enter surge por la instrucción:

Código :

cin.ignore(1024, '\n');
Aparte de dicho problema, esta instrucción y está comparación me parecieron un poco alocadas para este problema:

Código :

estado = cin.rdstate(); 
if ((estado & ios::failbit) == ios::failbit)
Me pareció que la mejor manera de solucionarlo era a partir del funcionamiento de los flujos en c++.

Decidí por mi cuenta investigar un poco más y encontré el manejo de estado de error de flujo. Obteniendo como resultado el siguiente código:

Validar datos entrados por el usuario en C++

Código :

/* Validación de tipos de datos sin usar aritmética binaria en c++
   Autor: John Sánchez Alvarez
   Este código es libre de usar y modificarse*/

#include <iostream>

using namespace std;

int main (){
   int numero, cont = 0;
   bool continuar;

   do {
      continuar = false;
      cin.clear();
      if(cont > 0) cin.ignore(1024, '\n');
      cout << "Introduce un numero: ";
      cin >> numero;
      cont++;
      if(cin.fail() && cin.rdstate()){
         cout << "NO ES UN NUMERO" << endl;
         continuar = true;
      }
   } while (continuar);

}
Lo intentaré explicar lo más detalladamente posible.

Para poder hacer la comprobación efectivamente es necesario el uso de la librería iostream. El estado de flujo se puede comprobar por medio de los bits de la clase ios. La cual es la clase base de istream, ostream e iostream, estás son las más utilizadas para el flujo de Entrada y Salida en C++.

La instrucción cin.clear(); borra y establece el flujo a goodbit; Cuando se establece gootbit todos los flags de error son limpiados.

La instrucción cin.ignore(1024, '\n') Ignorar hasta 1024 caractéres introducidos hasta encontrar un ENTER o viceversa, lo que primero ocurra.

La instrucción cin.fail() retorna true si una operación de flujo a fallado y es posiblie realizar una recuperación de esos errores.

La instrucción cin.rdstate() retorna true si el estado de flujo es correcto.

Espero este pequeño tip les sea de útilidad. :D

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate