Ayuda programa que comprueba si una cadena esta introducida correctamente

Iniciado por Herdo, 2 Abril 2016, 18:12 PM

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

Herdo

Hola, tengo un trabajo y es sobre crear un programa que muestre un menu con opciones, el usuario elige una opción y si elige la opción 1 tiene que introducir una nueva especie en la base de datos.
La condición para que la especie sea introducida es la siguiente:"nombre de la especie"-"numero de ejemplares"(en numeros)-dia/mes/año-"sección (una letra solo en mayusculas)"-"habitaculo (en numeros)"
Por ejemplo: Canis lupus familiaris−20−14/09/2015−H−5
El problema que tengo es que no me esta leyendo bien la cadena, tengo que usar la función atoi, pero no la que viene en la librería, tengo que crear una que ya la tengo, pero no se como aplicarla correctamente. Ya que al introducir la cadena cuando doy al enter me muestra todos los mensajes de error de datos.

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char nombre[30];
    int num_ejemplares;
    char sección;
    int habitaculo;
    int dia;
    int mes;
    int año;
}Especie;

int menu() {

    int op = 0;

    printf ("Prototipo de la Reserva natural.\n");
    printf ("1. Introducir una nueva especie.\n");
    printf ("4. Salir.\n");

    printf ("\nIntroduce una opcion: ");
    scanf ("%d", &op);

    return op;
}

void nuevo() {

    Especie e;

    int i, j;
    char especie [100];
    fflush(stdin);
    gets (especie);
    //Mientras sea diferente del - leera el texto
    for (i = 0; especie[i] != '-'; i++) {
        e.nombre[i] = especie[i];
    }
    //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
    i++;
    for (j = i; especie [j] != '-'; j++) {
        e.num_ejemplares = especie [j];
        //Controlara que el numero de ejemplares sea un numero y no un caracter
        if (e.num_ejemplares <= 0 || e.num_ejemplares >= 100) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    j++;
    //Lee el dia que introducido
    for (i = j; especie [i] != '/'; i++) {
         e.dia = especie [i];
        //Controla que el formato del dia este bien introducido
        if (e.dia <= 0 || e.dia > 31) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    i++;
    //Lee el mes introducido
    for (j = i; especie [j] != '/'; j++) {
        e.mes = especie [j];
        //Controla que el formato del mes este bien introducido
        if (e.mes <= 0 || e.mes > 12) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    j++;
    //Lee el año introducido
    for (i = j; especie [i] != '-'; i++) {
        e.año = especie [i];
        //Controla que el formato del año este bien introducido
        if (e.año < 1970 || e.año > 2060) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    i++;
    //Lee en que sección esta introducido
    for (j = i; especie [j] != '-'; j++) {
        e.sección = especie [j];
        //Controla que la sección este introducida con mayusculas
        if (e.sección < 'A' || e.sección > 'Z') {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    j++;
    //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
    for (i = j; especie [i] != '\0'; i++) {
        e.habitaculo = especie [i];
    }
    printf ("---> Especie introducida con exito.\n");
}

void mi_atoi(char cad [10]) {
    int r = 0;
    int i;
    for (i = 0; i < 10; i++) {
       r = r*10;
       r+= cad [i] - '0';
    }
}

void ejecutaOpcion(int op) {

    switch (op) {
        case 1:
            nuevo();
            break;

        default:
            break;
    }
}

int main() {

    int op = 0;

    do {
        op = menu();
        ejecutaOpcion(op);
    } while (op != 4);
    return 0;
}


Gracias.

MAFUS

El problema lo creas en como intentas leer los números
for (j = i; especie [j] != '-'; j++) {
    e.num_ejemplares = especie [j];

Puedes ver que introduces en e.num_ejemplares cada uno de los caracteres de la cadena. Mal porqué no son números en sí, son caracteres y porque a cada uno que vas encontrando lo estas metiendo en la variable mencionada sobreescribiendo el anterior.
Podriaa usar strtok y te quitarías mucho trabajo de encima pero si no puedes, porque no la habéis estudiado, puedes hacer otra cosa:
Vas leyendo cada caracter hasta ahora y miras si es un digito mediante isdigit, o te hacea tu propia función, si no la habeis estudiado.
Si el paso anterior ha tenido éxito metes el caracter en una cadena auxiliar.
Cuando tengas la cadena construida, mediante atoi, la conviertes en un número y lo metes en la variable del struct.
Si fallan los pasos anteriores paras e indicas el error.
Y así para todos los números.