Así voy ahora, pero tengo ciertos errores con el modulo 1
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define L_CLAVE 7
#define L_DESCRIPCION 20
#define L_BUFFER 100
struct producto {
char clave[L_CLAVE];
char descripcion[L_DESCRIPCION];
float precio;
};
void captura_producto(){
producto prod;
char buffer[L_BUFFER];
clrscr();
printf("Captura de producto\n\n");
/* captura de clave de producto */
printf("Clave: ");
gets(buffer);
if (strlen(buffer)<=L_CLAVE){
strcpy(prod.clave, buffer);
}
else{
printf("Error en captura de clave");
}
/* captura de descripcion */
printf("Descripcion: ");
gets(buffer);
if (strlen(buffer)<=L_DESCRIPCION){
strcpy(prod.descripcion, buffer);
}
else{
printf("Error en captura de descripcion");
}
/* captura de precio */
printf("Precio: ");
gets(buffer);
prod.precio = atof(buffer);
printf("\n\n\n");
printf("datos capturados\n");
printf("Clave: %s -- Decripcion: %s Precio: %f ", prod.clave, prod.descripcion, prod.precio);
}
int main(){
captura_producto();
return 0;
}
Primero, te recomiendo no usar funciones no estándar ni librerías no estándar, en tu caso: <clrcsr()> y <conio.h> ya que según el compilador que se use no va a funcionar. Y segundo el único error que tiene ese código es que en C:
struct Producto{
//...
};
Producto mi_producto; // ERROR!!
struct Producto mi_producto; // Correcto!!
Para no escribir siempre <struct> cuando te refieras al tipo <Producto> puedes usar <typedef>:
typedef struct Producto{
// ...
} Producto;
Producto mi_producto; // Correcto!!
Dejar claro que así lo que haces es permitirte usar el nombre <Producto> como sustituto de <struct Producto> pero NO estás creando ninguna variable llamada <Producto> de tipo <Producto>. En cambio si quitas <typedef> y haces:
struct Producto{
// ...
} mi_producto;
Sí estás creando ya una variable de tipo <Producto>. No te recomiendo hacer esto aunque lo verás en muchos sitios ya que entonces la variable es global y no es una buena práctica.
Otros consejos:
- Usar <fgets()> en lugar de <gets()>
- Usar <strncpy()> en lugar de <strcpy()>
Las alternativas que te he puesto permiten un parámetro donde especificar la longitud. Esto hace que las funciones sean más seguras para evitar desbordamientos.
- Si vas a comprobar si un nombre/clave/etc es demasiado larga, lo suyo sería después de avisar del error, permitir al usuario introducirlo de nuevo.
Pero vamos que estás cosas son recomendaciones que te digo. Si lo que quieres es acabarlo cuanto antes para entregarlo y ya pues como dicen muchos "Mientras compile..."