Hola
Veo que estás un poco perdida.
El main() está incompleto, no se llama a ninguna función de tu programa, cerca del menú escribes un prototipo de la función leer por debajo de la función leer() y a su vez está tiene otra definición, ¿ el switch ? el es scanf(formato, &variable) de la forma que está se ""romperá"" la memoria.
Por cierto scanf es rápido pero puede traer dolores de cabeza, es preferible evitarlo y usar algo más elaborado.
ejemplo:
int leer_dato()
{
char aux[10];
int dato;
printf("$ ");
fgets(aux, sizeof(aux), stdin);
sscanf(aux, "%d", &dato);
return dato;
}
Esto sirve para leer un dato entero sin problemas.
No está muy claro el primer enunciado de todas formas, me permito la siguiente interpretación:
Para tu caso de la carga de la matriz que el usuario ingresa y la impresión en pantalla podría ser así:
#include <stdio.h>
#define FILAS 24
#define COLUMNAS 5
int leer_dato()
{
char aux[10];
int dato;
printf("$ ");
fgets(aux, sizeof(aux), stdin);
sscanf(aux, "%d", &dato);
return dato;
}
void llenar_matriz(int matriz[][COLUMNAS])
{
int i, j;
printf("Carga de la matriz\n");
for (i = 0; i < FILAS; i++) {
for (j = 0; j < COLUMNAS; j++)
matriz[i][j] = leer_dato();
printf("-\n");
}
}
void mostrar_matriz(int matriz[][COLUMNAS])
{
int i, j;
printf("Datos de la matriz\n");
for (i = 0; i < FILAS; i++) {
for (j = 0; j < COLUMNAS; j++)
printf("%d\t", matriz[i][j]);
printf("\n");
}
}
int menu()
{
printf("\n\n1: Cargar matriz\n");
printf("2: Mostrar matriz\n");
printf("3: Salir\n\n");
return leer_dato();
}
int main()
{
int matriz[FILAS][COLUMNAS];
int opcion;
do {
opcion = menu();
switch (opcion) {
case 1:
llenar_matriz(matriz);
break;
case 2:
mostrar_matriz(matriz);
break;
case 3:
printf("¡chau!\n");
break;
default:
printf("Opción inválida\n");
}
} while (opcion != 3);
return 0;
}