problema con una función

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
blackmirror
Mensajes: 1
Registrado: 01/05/2017 10:36 am

problema con una función

#1 Mensaje por blackmirror » 01/05/2017 1:32 pm

Buenas,

necesitaba ayuda con una función que me da un problema, pongo el codigo:

Código: Seleccionar todo

int entrenumeros(num1,num2){
int i=0,resp;
char respuesta[15];

do{
    printf("Introduzca un numero entre %i y %i:\n",num1, num2);
    fgets(respuesta,sizeof(respuesta),stdin);
    
    for(i=0; respuesta[i] != '\0'; i++){ //lee los caracteres de uno en uno.
    
        if (isdigit(respuesta[i])){ //Si es un digito lo pone en la variable resp
            resp=atoi(respuesta);
            
            if ((resp>=num1 && resp<=num2)){ //Si resp esta entre los dos numeros que nosotros ponemos como parametros es correcto y sale del for y del do-while, retornando el valor de resp al programa principal
               break;
               }
            if((resp<num1 || resp>num2)){ //Si el numero no esta entre los parametros muestra el mensaje
            printf("Has realizado una seleccion no valida\n");
            break;
            }
        }
        
        if (isalpha(respuesta[i])){ //si es un caracter muestra el mensaje
        printf("Has realizado una seleccion no valida\n");
        break;
        }
     }
} while (!(resp>=num1 && resp<=num2)); //Solo sale si el numero introducido se encuentra entre los parametros puestos por nosotros.

return resp;
}      
El problema es que cuando pones por ejemplo "2ASKDASD" lee el primer 2 porque es un digito y el resto lo ignora , por lo que toma la cadena como si fuera correcta(cosa que no deberia a hacer la funcion, sino que deberia mostrar el mensaje de seleccion no valida). Alguna solución ?

Avatar de Usuario
daltomi
Mensajes: 354
Registrado: 28/04/2007 7:29 pm
Ubicación: Argentina

Re: problema con una función

#2 Mensaje por daltomi » 01/05/2017 7:57 pm

Buenas.

Existe una función que permite separar lo que es un número y los que no lo son, se llama strtol. De hecho atoi es un alias a strtol(nptr, NULL, 10); el cual descarta los errores de formatos iguales a los que indicas.
Un ejemplo que como podría utilizarse:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>

int entrenumeros (int num1, int num2)
{
    for (;;)
    {
        char * fin;
        char * linea = NULL;

        printf ("* Introduzca un número entre %i y %i:  ", num1, num2);

        // Extensión de GCC(gnu99)
        getline (& linea, & (size_t){0}, stdin);

        int numero = (int) strtol (linea, & fin, 10);

        // Como documentación, para el ejemplo.
        bool es_un_numero       = (linea != fin);
        bool no_contiene_letras = ( * fin == '\n' || * fin == '\0');
        bool es_un_rango_valido = (numero >= num1 && numero <= num2);
        bool contiene_letras    = ! no_contiene_letras;

        if (! es_un_numero || contiene_letras)
        {
            fprintf (stderr, "\nERROR: Ha ingresado un valor inválido: %s\n", fin);
        }
        else if (! es_un_rango_valido)
        {
            fprintf (stderr, "\nERROR: El valor ingresado esta fuera del rango.\n\n");
        }
        
        free (linea);       
        
        if (es_un_numero && no_contiene_letras && es_un_rango_valido)
        {
            return numero;
        }
    }
}


#define RESULTADO(func) \
    printf ("\n* Resultado de \"" #func "\" = %i\n\n", func)

int main (int argc, char * argv [])
{
    RESULTADO(entrenumeros(1, 100));
    RESULTADO(entrenumeros(100, 1000));
}
Saludos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados