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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda programa en C que lee una cadena
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda programa en C que lee una cadena  (Leído 1,608 veces)
Herdo

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda programa en C que lee una cadena
« en: 5 Marzo 2016, 15:11 pm »

Hola, soy nuevo programando en C y por el momento me esta gustando. En la universidad me mandaron a hacer un ejercicio que es sobre un programa que lee una cadena introducida por el usuario.
Luego de leer la cadena el programa mostrará por pantalla un mensaje de error en caso de que algo este mal introducido o un mensaje correcto.
El problema que tengo es que no entiendo muy bien como hacer que lea la cadena. Pongo un ejemplo del código que tengo hecho y unas imágenes de como debería funcionar el programa.
Código:
#include<stdio.h>

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

int menu (void) {
printf ("Prototipo de la Reserva natural.\n");
printf ("1. Introducir una nueva especie.\n");
printf ("2. Listar las especies alojadas.\n");
printf ("3. Mostrar estadisticas.\n");
printf ("4. Salir.\n");
}

int main () {
int op;
while (op != 4){
op == menu ();
scanf ("%d", &op);
if (op == 1) {
nuevo ();
}
}
}
//Opcion 1 que permite introducir una nueva especie
void nuevo () {
Especie e;
int i;
char especie [100];
gets (especie);
int cont;
//Mientras sea diferente del - leera el texto
while (especie [i] != '-') {
especie [i] = e.nombre;
}
//Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
i = i + 1;
while (especie [i] != '-') {
especie [i] = e.num_ejemplares;
//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.");
}
}
i = i + 1;
//Lee el dia que introducido
while (especie [i] != '/') {
especie [i] = e.dia;
//Controla que el formato del dia este bien introducido
if (e.dia <= 0 || e.dia > 31) {
printf ("--> Error en el formato de datos.");
}
}
i = i + 1;
//Lee el mes introducido
while (especie [i] != '/') {
especie [i] = e.mes;
//Controla que el formato del mes este bien introducido
if (e.mes <= 0 || e.dia > 12) {
printf ("--> Error en el formato de datos.");
}
}
i = i + 1;
//Lee el año introducido
while (especie [i] != '/') {
especie [i] = e.dia;
//Controla que el formato del año este bien introducido
if (e.dia <= 1970 || e.dia >= 2060) {
printf ("--> Error en el formato de datos.");
}
}
i = i + 1;
//Lee en que sección esta introducido
while (especie [i] != '-') {
especie [i] = e.sección;
//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.");
}
}
i = i + 1;
//Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
while (especie [i] != '\0') {
especie [i] = e.habitaculo;
//Controlara que el numero de habitaculo sea un numero y no un caracter
if (e.habitaculo <= '0' || e.habitaculo >= '100') {
printf ("--> Error en el formato de datos.");
}
}
printf ("---> Especie introducida con exito.\n");
}

Así es como debería funcionar el programa.


Y así debería dar error.


Otra cosa que no se muy bien como hacerla es sobre los espacios libres, se que tiene que ser con un array de 10 casillas que guarde los datos introducidos.

Perdón si es un desastre el código, pero soy nuevo en esto de la programación.

Gracias.


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda programa en C que lee una cadena
« Respuesta #1 en: 5 Marzo 2016, 20:29 pm »

Las imágenes no se ven.

Sobre tu código:
Código
  1. #include<stdio.h>
  2.  
  3. typedef struct {
  4.    char nombre [30];
  5.    int num_ejemplares;
  6.    char sección; // En muchos compiladores va a fallar tu nombre de variable
  7.                  // pues solo esperan letras del abecedario inglés: sin acentos.
  8.    int habitaculo;
  9.    int dia;
  10.    int mes;
  11.    int año; // Reafirmo lo dicho antes: en este caso se van a quejar de la letra ñ.
  12. } Especie;
  13.  
  14. int menu (void) {
  15.    printf ("Prototipo de la Reserva natural.\n");
  16.    printf ("1. Introducir una nueva especie.\n");
  17.    printf ("2. Listar las especies alojadas.\n");
  18.    printf ("3. Mostrar estadisticas.\n");
  19.    printf ("4. Salir.\n");
  20.  
  21.    // Aquí deberías pedir la opción numérica y devolverla
  22.    // con el return de la función.
  23. }
  24.  
  25. int main () {
  26.    int op;
  27.    while (op != 4){ // Varias cosas: op NO está inicializado, no
  28.                     // debes usar un valor que no hayas inicializado antes.
  29.                     // Los menús mejor hacerlos con un do ... while pues
  30.                     // seguro que querrás mostrarlo almenos una vez.
  31.        op == menu (); // Esto funcionaría en caso de que la función
  32.                       // menu() regresara algo controlado.
  33.        scanf ("%d", &op); // Esta linea y la anterior son contradictorias:
  34.                           // ¿Es la función menu() la que te devuelve la opción
  35.                           // o lo adquieres ahora en la función main()?
  36.        if (op == 1) { // Para resolver opciones de menú queda más límpio el
  37.                       // uso de la sentencia switch
  38.            nuevo ();
  39.        }
  40.    }
  41. }
  42.    //Opcion 1 que permite introducir una nueva especie
  43. void nuevo () {
  44.    Especie e; // e es una variable local. Cuándo termine la función nuevo()
  45.               // e va a desaparecer y con ella todo el trabajo que hayas
  46.               // hecho para rellenarla. C permite devolver estructuras así
  47.               // que en vez de declarar void nuevo() deberías haber declarado
  48.               // Especie nuevo() y recogerlo en main mediante algo parecido a
  49.               // Especie e = nuevo();
  50.    int i;
  51.    char especie [100];
  52.    gets (especie); // gets no se debería usar porqué al no controlar la cantidad
  53.                    // de datos que entran en la cadena podría sobrepasarse el tamaño
  54.                    // máximo del buffer y se sobreescribirían otros datos del programa.
  55.                    // usar fgets(stdin, especie, 100); en su lugar.
  56.    int cont;
  57.    //Mientras sea diferente del - leera el texto
  58.    while (especie [i] != '-') { // Varias cosas aquí que sirven para el resto de
  59.                                 // estructuras similares que hay en el programa:
  60.                                 // i no está inicializado y no se sabe que valor tiene.
  61.                                 // Estás leyendo quien sabe donde.
  62.                                 // Por otra parte i no se actualiza por tanto siempre
  63.                                 // trabajarás sobre la misma posición de memoria.
  64.                                 // Otra cosa: cuándo has recibido una línea formateada con
  65.                                 // delimitadores puedes usar la función strtok de string.h
  66.                                 // para recoger los diferentes datos de la cadena.
  67.        especie [i] = e.nombre;  
  68.    }
  69.    //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
  70.    i = i + 1; // Para incrementar en 1 una variable numérica es mejor usar el operador unario ++
  71.               // Aquí quedaría mejor i++;
  72.               // O mejor aún, sobre todo en compiladores antiguos usar ++i por la razón de que el
  73.               // código objeto quedaba aún más optimizado.
  74.    while (especie [i] != '-') {
  75.        especie [i] = e.num_ejemplares; // Las cadenas no se copian mediante el operador =
  76.                                        // esto te serviría para copiar punteros pero en este caso
  77.                                        // perderías la información cuándo el usuario hiciera una nueva
  78.                                        // entrada. En su lugar deberías usar strncpy de string.h
  79.                                        // Por otra parte, y dejando de lado el punto anterior, aquí
  80.                                        // tienes un error de lógica y es que intentas guardar en la cadena
  81.                                        // desde la que estas, en teoría, leyendo, el el valor de la variable
  82.                                        // que debería ser el destino. ***Aunque está mal*** debería ser
  83.                                        // e.num_ejemplares = especie[i]
  84.                                        // Por cierto, i sigue sin saberse a donde se apunta e itera siempre
  85.                                        // en la misma posición. A partir de ahora obviaré este error.
  86.                                        // e.num_ejemplares es un entero, para un usuario es imposible que
  87.                                        // te escriba un entero como tipo de dato en una cadena.
  88.                                        // Deberías crear una cadena auxiliar con, y solo con, el dato numérico
  89.                                        // y pasarlo a entero mediante la siguiente construcción:
  90.                                        // sscanf(cad_auxiliar, "%i", e.num_ejemplares);
  91.        //Controlara que el numero de ejemplares sea un numero y no un caracter
  92.        if (e.num_ejemplares <= '0' || e.num_ejemplares >= '100') { // Entre comillas simples solo se ponen
  93.                                                                    // constantes de caracter.
  94.                                                                    // Las constantes de cadena se ponen entre
  95.                                                                    // comillas dobles.
  96.                                                                    // Pero en tu caso lo que estás comparando son
  97.                                                                    // constantes numéricas por lo que deben ir sin
  98.                                                                    // delimitar.
  99.            printf ("--> Error en el formato de datos.");
  100.        }
  101.    }
  102.    i = i + 1;
  103.    //Lee el dia que introducido
  104.    while (especie [i] != '/') {
  105.        especie [i] = e.dia;
  106.        //Controla que el formato del dia este bien introducido
  107.        if (e.dia <= 0 || e.dia > 31) {
  108.            printf ("--> Error en el formato de datos.");
  109.        }
  110.    }
  111.    i = i + 1;
  112.    //Lee el mes introducido
  113.    while (especie [i] != '/') {
  114.        especie [i] = e.mes;
  115.        //Controla que el formato del mes este bien introducido
  116.        if (e.mes <= 0 || e.dia > 12) {
  117.            printf ("--> Error en el formato de datos.");
  118.        }
  119.    }
  120.    i = i + 1;
  121.    //Lee el año introducido
  122.    while (especie [i] != '/') {
  123.        especie [i] = e.dia;
  124.        //Controla que el formato del año este bien introducido
  125.        if (e.dia <= 1970 || e.dia >= 2060) { // Supongo que aquí querías decir e.año
  126.            printf ("--> Error en el formato de datos.");
  127.        }
  128.    }
  129.    i = i + 1;
  130.    //Lee en que sección esta introducido
  131.    while (especie [i] != '-') {
  132.        especie [i] = e.sección;
  133.        //Controla que la sección este introducida con mayusculas
  134.        if (e.sección < 'A' || e.sección > 'Z') {
  135.            printf ("--> Error en el formato de datos.");
  136.        }
  137.    }
  138.    i = i + 1;
  139.    //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
  140.    while (especie [i] != '\0') {
  141.        especie [i] = e.habitaculo;
  142.        //Controlara que el numero de habitaculo sea un numero y no un caracter
  143.        if (e.habitaculo <= '0' || e.habitaculo >= '100') {
  144.            printf ("--> Error en el formato de datos.");
  145.        }
  146.    }
  147.    printf ("---> Especie introducida con exito.\n");
  148.    // La función main debe devolver un entero. El estándar dice que se debe
  149.    // devolver 0 si el programa ha tenido éxito. C define una macro llamada
  150.    // EXIT_SUCCESS en stdlib.h usada para éste menester. Puedes elegir la forma
  151.    // que quieras.
  152. }
  153.  


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines