Si no sabes el largo que va a tomar la frase tienes que usar punteros
pero para cada palabra puedes asignarle un espacio TOPE
pero para cada palabra puedes asignarle un espacio TOPE
Me ha gustado el uso del puntero con asignación dinámica de memoria, eso sí con lo que tan acertadamente comenta eferion respecto a dicha asignación así como el uso del bool.
Sólo unos pequeñitos detalles:
* creo que falta la librería stdbool.h
* ¿No te sobra el "&" en los scanf al tratarse de arrays?.
* Tal como lo tienes, introduce un espacio en blanco al comienzo de la frase, cosa que no procede.
* ¿Es tan necesario el uso de memset?. Para inicializar "frase " podríamos usar calloc, en lugar de malloc, y respecto a inicializar a la variable "aux", ¿es tan necesario?. Dudas, dudas .....
* Podemos ahorrarnos uno de los scanf haciendo la pregunta al entrar la frase.
Son sólo detallitos sin mayor importancia pero creo que eferion me ha contagiado el estado "quisquilloso" hoy.
Pero insisto, me ha gustado la aportación, tanto que con tu permiso la modifico para tener en cuenta los pequeñitos detalles que mencioné:
Código
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> char *funcion ( char *frase ) { bool cont = true ; char aux [ 50 ] ; frase = calloc ( sizeof aux , sizeof ( char ) ) ; printf("\nEscribe una palabra ( n para salir ): ") ; scanf ( "%s" , aux ) ; strcpy( frase , aux ) ; while ( cont ) { printf("\nEscribe una palabra ( n para salir ): ") ; scanf ( "%s" , aux ) ; ( strlen ( aux ) == 1 && ( aux[0] == 'n' || aux[0] == 'N') ) ? cont = false : sprintf ( frase , "%s %s" , frase , aux ) ; frase = realloc ( frase , sizeof ( aux ) + strlen ( frase ) ) ; } return frase ; } int main( ) { char *frase ; printf( "\n\nLa frase es:\n\n%s" , funcion ( frase ) ) ; free ( frase ) ; return EXIT_SUCCESS ; }
¡¡¡¡ Saluditos! ..... !!!!