Muchas gracias por la ayuda, me sirvio bastante las pistas, pues aún no se como implementar bien lo de realloc, pero ya voy entendiendo como trabaja esto, finalmente pude sacarlo como queria, dejo el código, pero pues, como podría adaptarse la parte realloc sin tener un máximo constante para el número de caracteres que debe reservarse en memoria sin que se desperdicie??
Código (c) [Seleccionar]
/*
Escribir un programa para leer n cadenas de caracteres. Cada cadena tiene una longitud variable
y esta formada por cualquier carácter. La memoria que ocupa cada cadena se ha de ajustar al
tamaño que tiene. Una vez leidas las cadenas se debe realizar un proceso que consiste en eliminar
todos los blancos, siempre manteniendo el espacio ocupado ajustado al número de caracteres.
El programa debe mostrar las cadenas leídas y las cadenas transformadas.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define longitud 100
int main()
{
char **cadena;
int num_cadenas;
int contador=0;
int i,j;
do
{
printf("Digite el numero de cadenas: ");
scanf("%d%c", &num_cadenas);
}while(num_cadenas < 1);
cadena = (char**) calloc(num_cadenas, sizeof(char*));
if(cadena == NULL)
{
printf("\n\t Error de asignación de memoria, adios!!");
exit(-1);
}
// leyendo cada linea en memoria
for(i=0; i<num_cadenas; i++)
{
// Reservando el bloque de memoria para cada linea
cadena[i] = (char*) calloc(longitud, sizeof(char)); // +1 por '\n'
printf("Digite la cadena # %d: ", i+1);
fgets(cadena[i], longitud, stdin);
}
for(i=0; i<num_cadenas; i++)
{
for(j=0; j<strlen(cadena[i]); j++ )
{
if(cadena[i][j] == ' ')
{
cadena[i][j] = cadena[i][j+1];
}
}
}
for (i = 0; i < num_cadenas; i++)
printf("cadena # %2d: %s", i + 1, cadena[i]);
/* Primero se libera la memoria de cada linea ... */
for (i = 0; i < num_cadenas; i++)
free(cadena[i]);
/* ... a continuacion el bloque de memoria principal */
free(cadena);
return 0;
}