[ Foro de C ]

Problema para cargar y mostrar un arreglo de caracteres en c

13-Jul-2021 04:14
Invitado (samuel)
1 Respuestas

Hola, estoy teniendo unos problemas para poder hacer un ejercicio, tengo que hacer unas acciones, cargar, mostrar que reciban un registro que dentro contenga un arreglo y la cantidad de nombres cargados. y después funciones llena y vacía que reciban el registro también y me devuelvan verdadero o falso. y por ultimo una acciones que es insertar que recibe el registro y un nuevo nombre y lo que debe hacer es agregar este nombre al final del arreglo. y una acción suprimir que recibe el registro y suprime el primero nombre. esto es lo que tengo
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#define max 1000
typedef struct
{
char Nombres[max+1];

int cant;
}TNombres;

bool Vacio(TNombres verificacion);
bool llena(TNombres verificacion);
void insertar(TNombres *verificacionc,char *nombreInsertar);
void mostrar(TNombres verificacion);
void cargar(TNombres *verificacion);
int main(){
TNombres nombre;
char insertarnombre;
bool vacio;
int i;
bool estara;
   printf("ingrese la cantidad de nombres a cargar ");
   scanf("%d",&nombre.cant);
   vacio=Vacio(nombre);
if(vacio){
  printf("arreglo vacio ");
 }else{
   cargar(&nombre);
 }
  mostrar(nombre);
estara=llena(nombre);
 if(estara){
  printf("arreglo lleno");
 }else{
   insertar(&nombre,&insertarnombre);
   printf("%d",&nombre.cant);
}
   mostrar(nombre);
}
bool Vacio(TNombres verificacion){
if(verificacion.cant == 0){
return true;     // arreglo vacio
}else
 {
  return false;   // arreglo no vacio
}
}

bool llena(TNombres verificacion){
 if(verificacion.cant==max){
  return true;     // arreglo lleno
   }else{
  return false;    //arreglo no lleno
 }
}
void insertar(TNombres *verificacion, char *nombreInsertar){    
printf("ingrese nuevo nombre ");    
scanf("%s",&nombreInsertar);    
(*verificacion).cant=(*verificacion).cant+1;    
(*verificacion).Nombres[(*verificacion).cant]=*nombreInsertar;  
}
void mostrar(TNombres verificacion){  
int i;
   printf("los nombres ingresados son\n");
   for(i=0;i<verificacion.cant;i++){
     //printf("%s\n",&verificacion.Nombres[i]);    
puts(&verificacion.Nombres[i]);    
}
 }
 void cargar(TNombres *verificacion){    
int i;
   printf("ingrese los nombres\n");
   for(i=0;i<(*verificacion).cant;i++){
     scanf("%s",&(*verificacion).Nombres[i]);    
   }
 }  
a la hora de mostrar lo que pasa es que me muestra el ultimo nombre dependiendo de la cantidad de nombres cargado, y me los muestra el primero con la primera letra del primer y segundo nombre, el segundo con la primer letra del segundo y el ultimo normal. y bueno después cuando llega a insertar si el arreglo esta lleno se ejecuta mostrar y si tengo que insertar un nombre no se ejecuta, si pongo max como 10 y lleno el arreglo se me hace un bucle infinito entonces puse el max+1 para poder comprobar esa opcion


15-Jul-2021 17:10
Invitado (pancho)

la verdad es que tienes un buen lio montado

además TNombres me parece absurdo ya que según
dices todos tendrían el mismo número, la
cantidad de nombres, lo cual no tiene sentido
a menos que el número de cada nombre en la
estructura sea el número de indice lo cual
también es rebundante

el lio empieza porque en tu programa no hay
ningun array de TNombres solo hay un elemento
llamado nombre que usas como un array que no es

deberias tener un contador de registros usados
para incrementar o decrementar y saber el límite
antes de llamar a insertar o suprimir

verificar si el nombre es correcto antes de salir
de insertar, por cierto es una patata ya que no
sabes copiar un array en otro, copias siempre el
mismo caracter

mi recomendación es que tengas clara la lógica del
programa con un diagrama de flujo y hagas
comprobaciones de cada cosa con un debuger o con
impresiones y ver que lo que hace el programa es lo
que esperas que haga y así avances poco a poco

cualquier duda pasa por aquí

suerte ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)