isdigit(); problema con validacion de caracteres

Iniciado por Netzari Limas, 25 Marzo 2015, 07:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Netzari Limas

Buenas, soy nuevo en este foro y quisiera saber si me pueden ayudar con mi codigo..

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
int numeros[10];

int i,n;
int j;
int main(int argc, char *argv[])
{
   
    char desea;
    do
    {
    cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
    for (i=0; i<=9; i++)
    {
  printf("Ingrese un numero %i: ", i+1);
  scanf("%i", &numeros[i]);
  //FALTA VALIDAR EL INGRESO DE CARACTERES//               
        }
        for (j=0; j<=9; j++)
        {
            cout << numeros[j];
            cout <<"\n";
            }
            fflush(stdin);
            cout << "Desea continuar con el programa ? (S/N) \n";
            cin >>desea;
            desea = toupper(desea);
            if (desea!='S' && desea!='N')
            {
                           do
                           {
                           fflush(stdin);
                           cout <<"Error! inserte (S/N) \n";
                           cin >>desea;
                           desea = toupper(desea);
                           }while (desea!='S' && desea!='N');
                           } 
            }while(desea=='S');
    system("PAUSE");
    return EXIT_SUCCESS;
}


Se supone que mi programa se ingresan numeros, pero tengo que validar que no se puedan ingresar caracteres al principio y cuando me pide que inserte un numero, e ingreso un caracter me lanza error. Ayuda plz como uso ahi el isdigit();

Gracias de antemano:)

eferion

#1
Cita de: Netzari Limas en 25 Marzo 2015, 07:18 AM
Código (cpp) [Seleccionar]

   cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
   for (i=0; i<=9; i++)
   {
 printf("Ingrese un numero %i: ", i+1);
 scanf("%i", &numeros[i]);

No tiene demasiado sentido que estés mezclando "cout" (propio de C++) con "printf" (herencia de C). Lo suyo, por claridad, es que usases todo el rato "cout". Lo mismo te digo con "cin" y "scanf".

Cita de: Netzari Limas en 25 Marzo 2015, 07:18 AM
Código (cpp) [Seleccionar]
flush(stdin);

Vaya manía con usar fflush sobre los buffer de entrada... fflush está pensado para ser utilizado con los buffer de salida, no con los de entrada. Usar fflush sobre un buffer de entrada va a dar un resultado indeterminado, es decir, puede que en tu casa funcione perfectamente y que delante del profesor falle sin remedio. Hay otras alternativas (aunque quizás no tan "bonitas") para vaciar el buffer de entrada... por ejemplo algo del tipo:

Código (cpp) [Seleccionar]

#include <limits>

cin.ignore(numeric_limits<int>::max());


Hablando de tu problema, lo que quieres es verificar que la tecla pulsada por el usuario se corresponde, efectivamente, con un número. Lo que tienes que hacer entonces es leer un carácter y verificar si dicho carácter se corresponde con un dígito o no. Algo tal que:

Código (cpp) [Seleccionar]
int numero = 0;
char c;
cin >> c;
if ( is_digit( c ) )
{
 // Es un dígito numérico
 numero = c - '0';
}
else
{
 // No es un dígito numérico
}


Por cierto, el include a math.h... que usando la versión C++ debería quedar tal que "#include <cmath>", te sobra. No estás haciendo uso de ninguna función matemática que yo vea.

Un saludo.

Netzari Limas

Disculpa, muchas gracias portu ayuda, ahora ya puedohacerlo, pero falta un detalle que todavia ando checando y si pudieras ayudarme un poco te lo agradeceria:)

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int numeros[10];

int i,n;
int j;
int main(int argc, char *argv[])
{
   
    char desea;
    char c;
    do
    {
    cout << "Bienvenido al programa para desplegar 10 numeros! \n"<<endl;
    for (i=0; i<=9; i++)
    {
  cout<<"Ingrese un numero "  <<i+1<<endl;
  cin >>c;
  if(isdigit(c))
  {
                 numeros[i]= c - '0';
                 }
                 else
                 {
                     cout <<"No es un digito numerico \n";
                     i--;
                     }             
        }
        for (j=0; j<=9; j++)
        {
            cout << numeros[j];
            cout <<"\n";
            }
            fflush(stdin);
            cout << "Desea continuar con el programa ? (S/N) \n";
            cin >>desea;
            desea = toupper(desea);
            if (desea!='S' && desea!='N')
            {
                           do
                           {
                           fflush(stdin);
                           cout <<"Error! inserte (S/N) \n";
                           cin >>desea;
                           desea = toupper(desea);
                           }while (desea!='S' && desea!='N');
                           } 
            }while(desea=='S');
    system("PAUSE");
    return EXIT_SUCCESS;
}


Cuando inserto ahora mas de dosdigitos ejemplo: 23 , me lo toma como dos.. y se salta 2 preguntas... :/ que puedo hacer para que el caracter le quepan mas numeros?

GRACIAS:)

NOIS

Puedes hacer un array del char, utilizar un int para registrar los números o, ya que estás en C++ usar string
NOIS dev7

eferion

Tienes varias opciones:

1. Leer la entrada del tirón como si fuese un string y comparar dígito a dígito:

Código (cpp) [Seleccionar]

std::string cad;
cin >> cad;
for( int i=0; i < cad.length( ); ++i )
{
 if ( !std::is_digit( cad[ i ] ) )
 {
   // ERROR
 }
}


2. Intentar leer directamente el número como tal y comprobar errores:

Código (cpp) [Seleccionar]

int numero;
cin >> numero;
if ( !cin )
{
 cin.clear( );
 // ERROR: No es un número
}