Título: [AYUDA] Ejercicio concatenar Publicado por: joraloma en 11 Enero 2015, 12:35 pm Buenas gracias por .el aviso en el otro tema, puse una pregunta muy general jeje, bueno la cuestion es la siguiente en el ejercicio 3 tengo que concatenar, y hacer una especie de lista, el resultado debería corresponderse con :
Citar salas@318CDCr12: ̃$ ./nombreCompleto Introduzca nombre : SALIR DEL PROGRAMA salas@318CDCr12: ̃$ ./nombreCompleto Introduzca nombre : Fulanito Introduzca primer apellido : de Tal Introduzca su segundo apellido: y Cual Nombre completo: de Tal y Cual, Fulanito Introduzca nombre : SALIR salas@318CDCr12: ̃$ ./nombreCompleto Pero yo obtengo : Citar salas@318CDCr12: ̃$ ./nombreCompleto Introduzca nombre : SALIR DEL PROGRAMA salas@318CDCr12: ̃$ ./nombreCompleto Introduzca nombre : John Introduzca primer apellido : Smith Introduzca su segundo apellido: Nombre completo: Smith John Introduzca nombre : SALIR salas@318CDCr12: ̃$ ./nombreCompleto Y mi código es: Código: /* Includes del sistema */ Ojala sepan la solución, gracias!!! Título: Re: [AYUDA] Ejercicio concatenar Publicado por: Yoel Alejandro en 11 Enero 2015, 16:44 pm Hola joraloma, el problema es que la función de entrada fgets() coge el carácter de nueva línea o ENTER y lo agrega al final de las cadenas ap1, ap2, por eso al concatenar e imprimir, se imprime dicho salto de línea pareciendo como si fueran dos cadenas distintas
Una solución es depurar la cadena recibida para eliminar el salto de línea hallado al final de la misma, reemplazándolo por el carácter nulo de terminación: Código
y luego haces lo mismo para ap2, con lo cual debería solucionarse el problema. Título: Re: [AYUDA] Ejercicio concatenar Publicado por: joraloma en 11 Enero 2015, 16:48 pm Hola joraloma, el problema es que la función de entrada fgets() coge el carácter de nueva línea o ENTER y lo agrega al final de las cadenas ap1, ap2, por eso al concatenar e imprimir, se imprime dicho salto de línea pareciendo como si fueran dos cadenas distintas Una solución es depurar la cadena recibida para eliminar el salto de línea hallado al final de la misma, reemplazándolo por el carácter nulo de terminación: Código
y luego haces lo mismo para ap2, con lo cual debería solucionarse el problema. SI ! Mil gracias ahora va perfecto, una pregunta la liberación de memoria esta bien situada? Esque al pasar el comprueba de mi profesor, da error, "Error in ________ free(): invalid next size(fast): 0x09425008 *** Título: Re: [AYUDA] Ejercicio concatenar Publicado por: Yoel Alejandro en 11 Enero 2015, 17:31 pm Pues, la liberación de memoria la veo bien, habría que ver qué opinan lo otros foristas ......
Excepto la cadena "todo" cuya asignación de memoria ocurre dentro de la ejecución del primer do-while, por lo que no está garantizada en todos los casos. Una sentencia más segura preguntaría primero si el malloc() se ejecutó primero, esto es: Código
prueba de esta manera y me comentas. Título: Re: [AYUDA] Ejercicio concatenar Publicado por: joraloma en 12 Enero 2015, 00:56 am Gracias lo he probado pero nada tio, no funciona... mismo fallo.. y estoy perdido
Título: Re: [AYUDA] Ejercicio concatenar Publicado por: rir3760 en 12 Enero 2015, 04:09 am Mil gracias ahora va perfecto, una pregunta la liberación de memoria esta bien situada? Esque al pasar el comprueba de mi profesor, da error, "Error in ________ free(): invalid next size(fast): 0x09425008 *** + Gracias lo he probado pero nada tio, no funciona... mismo fallo.. y estoy perdido Cuando hagas cambios a un programa publica el código fuente actualizado, si no lo haces no hay forma de ayudarte. ---- En cuanto al código fuente de tu primer mensaje no es necesario inicializar las variables "nombre", "ap1" y "ap2" si lo primero que haces con ellas es asignarles el resultado de calloc y tampoco es necesaria la conversión explicita de (el valor de retorno de) esa función: Código Basta con: Código Un error importante se repite cuando pides el nombre, apellido paterno y materno: Código Las tres mentadas variables no las debes modificar porque ellas almacenan la dirección base de los tres bloques, al almacenar en estas el resultado de strchr pierdes esas direcciones y las llamadas a free no serán validas (comportamiento no definido). En su lugar debes utilizar otra variable, por ejemplo: Código
Otro error se genera cuando tratas de imprimir el nombre completo al utilizar "ap1" cuando debería ser "todo": Código Por ultimo si la intención es imprimir el nombre completo en la forma "paterno materno, nombre" no es necesario reservar memoria, basta con una sola llamada a printf: Código Un saludo |