elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA] Ejercicio concatenar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA] Ejercicio concatenar  (Leído 2,314 veces)
joraloma

Desconectado Desconectado

Mensajes: 11


Ver Perfil
[AYUDA] Ejercicio concatenar
« 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 */ 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Includes de la aplicacion */
#include "nombreCompleto.h"
/* Definición de constantes */

/* Tipos definidos por el usuario */

/************************************************************/

int main()
{
  char * nombre = NULL;
  char * ap1 = NULL;
  char * ap2 = NULL;
  int tam;
  char * todo=NULL;

 
  nombre = (char *) calloc(TAM, sizeof(char));
  ap1 = (char *) calloc(TAM, sizeof(char));
  ap2 = (char *) calloc(TAM, sizeof(char));
  if(nombre == NULL || ap1 == NULL || ap2 == NULL)
    fprintf(stderr, MENSAJE_MEMORIA);
  else
    {
      do
{
  printf(PIDE_NOMBRE);
  fgets(nombre, TAM, stdin);
  nombre=strchr(nombre,'\n');
  *nombre='\0';
  if(strncmp(nombre, NOMBRE_SALIR, NCOMPARAR) != 0)
    {
      printf(PIDE_AP1);
      fgets(ap1, TAM, stdin);
      ap2=strchr(ap1,'\n');
      *ap2='\0';
      printf(PIDE_AP2);
      fgets(ap2, TAM, stdin);
      ap2=strchr(ap2,'\n');
      *ap2='\0';
      tam = strlen(nombre) + strlen(ap1) + strlen(ap2);
      todo = (char *) calloc(tam, sizeof(char));
      todo = strcat(todo, ap1);
      todo = strcat(todo, ap2);
      todo = strcat(todo, nombre);

      printf(TEXTO_NOMBRE_COMPLETO, ap1);
      printf("%d", tam);
    }
}
      while(strncmp(nombre, NOMBRE_SALIR, NCOMPARAR) != 0);
      free(nombre);
      nombre = NULL;
      free(ap1);
      ap1 = NULL;
      free(ap2);
      ap2 = NULL;
      free(todo);
      todo = NULL;
 
    }
  return 0;
}

/* Definiciones de funciones  */

Ojala sepan la solución, gracias!!!


En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [AYUDA] Ejercicio concatenar
« Respuesta #1 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
  1. size_t n;
  2.  
  3. n = strlen( ap1 );
  4. if ( n > 0 && ap1[n-1] == '\n' ) ap1[n-1] = '\0';

y luego haces lo mismo para ap2, con lo cual debería solucionarse el problema.


En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
joraloma

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: [AYUDA] Ejercicio concatenar
« Respuesta #2 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
  1. size_t n;
  2.  
  3. n = strlen( ap1 );
  4. if ( n > 0 && ap1[n-1] == '\n' ) ap1[n-1] = '\0';

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 ***
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: [AYUDA] Ejercicio concatenar
« Respuesta #3 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
  1. if ( todo != NULL) {
  2.    free( todo );
  3.    todo = NULL;
  4. }

prueba de esta manera y me comentas.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
joraloma

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: [AYUDA] Ejercicio concatenar
« Respuesta #4 en: 12 Enero 2015, 00:56 am »

Gracias lo he probado pero nada tio, no funciona... mismo fallo.. y estoy perdido
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [AYUDA] Ejercicio concatenar
« Respuesta #5 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
  1. nombre = (char *) calloc(TAM, sizeof(char));
Basta con:
Código
  1. nombre = calloc(TAM, 1);

Un error importante se repite cuando pides el nombre, apellido paterno y materno:
Código
  1. printf(PIDE_NOMBRE);
  2. fgets(nombre, TAM, stdin);
  3. nombre = strchr(nombre,'\n'); /* <== */
  4. *nombre = '\0';
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
  1. char *p;
  2.  
  3. /* ... */
  4.  
  5. printf(PIDE_NOMBRE);
  6. fgets(nombre, TAM, stdin);
  7. if ((p = strchr(nombre, '\n')) != NULL)
  8.   *p = '\0';

Otro error se genera cuando tratas de imprimir el nombre completo al utilizar "ap1" cuando debería ser "todo":
Código
  1. printf(TEXTO_NOMBRE_COMPLETO, ap1);

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
  1. printf("%s %s, %s\n", ap1, ap2, nombre);

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 15,852 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
Ayuda ejercicio de Pascal, cuando uno no lo ve claro pide ayuda
Programación General
manu3742 1 3,266 Último mensaje 31 Marzo 2011, 15:43 pm
por d(-_-)b
[AYUDA] Cómo puedo concatenar un char a un puntero de chars?
Programación C/C++
papita5 8 6,338 Último mensaje 19 Octubre 2011, 20:39 pm
por papita5
Ayuda Con Ejercicio
ASM
sebis 1 2,934 Último mensaje 10 Septiembre 2012, 13:12 pm
por Eternal Idol
Ayuda! Concatenar carácteres en C
Programación C/C++
ARCAME 1 2,250 Último mensaje 2 Diciembre 2012, 20:50 pm
por durasno
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines