Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Arreglos,punteros y sprintf.-

Estas en el tema de Arreglos,punteros y sprintf.- en el foro de C/C++ en Foros del Web. Cita: Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no ...
  #1 (permalink)  
Antiguo 12/12/2013, 16:06
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Arreglos,punteros y sprintf.-

Cita:
Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-
Hola todos.
Estoy estudiando punteros y me encuentro con este inconveniente que no puedo resolver, bueno no les doy más explicaciones porque en la captura queda claro que en la cadena concatenada me está tomando el salto de línea de las cadenas individuales, eso es lo que deseo resolver.-




Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. #define MAX 30
  4.  
  5. int main(void){
  6.     char nombre_completo[93], *ptrNC = nombre_completo,
  7.          primer_nombre[MAX+1], *ptrPN = primer_nombre,
  8.          segundo_nombre[MAX+1], *ptrSN = segundo_nombre,
  9.          apellido[MAX+1], *ptrAP = apellido;
  10.     int longitud;
  11.    
  12.     printf("\n\n Ingrese primer nombre.....: ");
  13.     fgets(ptrPN, MAX, stdin);
  14.     printf("\n Ingrese segundo nombre....: ");
  15.     fgets(ptrSN, MAX, stdin);
  16.     printf("\n Ingrese apellido..........: ");
  17.     fgets(ptrAP, MAX, stdin);
  18.    
  19.     longitud = sprintf(ptrNC, "%s %s %s", ptrPN, ptrSN, ptrAP);
  20.    
  21.     printf("\n El nombre completo es: %s.\n", ptrNC);
  22.     printf("\n Total de caracteres..: %d", longitud);
  23.    
  24.     return 0;
  25. }

Saludos.
Daniel


  #2 (permalink)  
Antiguo 12/12/2013, 19:12
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: Arreglos,punteros y sprintf.-

Para éste caso, es mejor crearse una solución propia, fgets termina su función cuando detecta un salto de linea, siempre terminará con ello, entonces podríamos hacer así:

Código C:
Ver original
  1. char *
  2. fgets_fix (char * buff, size_t bufflen, FILE * fp)
  3. {
  4.   if (fgets(buff, bufflen, fp) != 0)
  5.   {
  6.     char * nw = NULL;
  7.       nw = strchr(buff, '\n');
  8.      
  9.     if (nw != NULL)
  10.       *nw = '\0';
  11.    
  12.     return buff;
  13.   }
  14.  
  15.   return 0;
  16. }

En el caso de los punteros, no tiene nada que ver, está bien :)
  #3 (permalink)  
Antiguo 13/12/2013, 06:51
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Arreglos,punteros y sprintf.-

Hola guzzano.
Seguramente debe ser funcional tú código, pero por el momento y por mis conocimientos no logro implementarlo, no me sirve con tan sólo copiar y pegar debo entender lo que hace cada línea.-
Muchas gracias por el código por el momento lo solucioné con esto:

Código C:
Ver original
  1. ptrPN[strlen(ptrPN)-1]='\0';

Saludos.
Daniel
  #4 (permalink)  
Antiguo 13/12/2013, 08:15
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 9 meses
Puntos: 13
Respuesta: Arreglos,punteros y sprintf.-

Cita:
Iniciado por RoDaVi Ver Mensaje
Hola guzzano.
Seguramente debe ser funcional tú código, pero por el momento y por mis conocimientos no logro implementarlo, no me sirve con tan sólo copiar y pegar debo entender lo que hace cada línea.-
Muchas gracias por el código por el momento lo solucioné con esto:

Código C:
Ver original
  1. ptrPN[strlen(ptrPN)-1]='\0';

Saludos.
Daniel
Esa también es buena solución, pero estaría mejor si compruebas lo que te devuelve strlen. Si por algún caso, la variable está vacía, entonces strlen devolvería 0, y la dirección que va a escribir el \0 será -1 lo cual hará que el programa falle.

Código C:
Ver original
  1. char *
  2. fgets_fix (char * buff, size_t bufflen, FILE * fp)
  3. {
  4.   if (fgets(buff, bufflen, fp) != NULL) // Devolverá NULO si hay un error.
  5.   {
  6.     char * nw = NULL; // Se crea un puntero nulo.
  7.       nw = strchr(buff, '\n'); //strchr busca en la variable buff el carácter \n y devuelve la posición en la memoria donde está ese carácter.
  8.      
  9.     if (nw != NULL) // Verificamos que nw tenga valor después de usar el strchr;
  10.       *nw = '\0'; // Le asigamos a la dirección encontrada \0 que antes valía \n
  11.    
  12.     return buff;
  13.   }
  14.  
  15.   return NULL;
  16. }
  #5 (permalink)  
Antiguo 13/12/2013, 11:24
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Arreglos,punteros y sprintf.-

Hola Guzzano.
Si logro hacer correctamente la llamada a la función(cosa que dudo) seguramente habre entendido todo.-

Saludos.
Daniel

Última edición por RoDaVi; 13/12/2013 a las 11:30
  #6 (permalink)  
Antiguo 13/12/2013, 15:21
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Arreglos,punteros y sprintf.-

Hola guzzano.
Ahora acate cargo, me picó el bicho de la curiosidad y quiero me ayudes a completarlo, todo funciona sólo que ahora quiero capturar en la función principal si no se ingresa nada en cualquiera de los 3 casos para hacer un bucle y que se pueda salir sólo si la variable contiene algún dato.-
Lo probé de diversas formal pero no logro capturar el retorno de la función.-

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX 30
  5.  
  6. char * fgets_fix(char * buff, size_t bufflen, FILE * fp);
  7.  
  8. int main(void){
  9.     char nombre_completo[93], *ptrNC = nombre_completo,
  10.          primer_nombre[MAX], *ptrPN = primer_nombre,
  11.          segundo_nombre[MAX], *ptrSN = segundo_nombre,
  12.          apellido[MAX], *ptrAP = apellido;
  13.     int longitud;
  14.    
  15.     printf("\n\n Ingrese primer nombre.....: ");
  16.     fgets_fix(ptrPN, MAX, stdin);
  17.    
  18.     printf("\n Ingrese segundo nombre....: ");
  19.     fgets_fix(ptrSN, MAX, stdin);
  20.    
  21.     printf("\n Ingrese apellido..........: ");
  22.     fgets_fix(ptrAP, MAX, stdin);
  23.    
  24.     longitud = sprintf(ptrNC, "%s %s %s", ptrPN, ptrSN, ptrAP);
  25.    
  26.     printf("\n El nombre completo es: %s\n", ptrNC);
  27.     printf("\n Total de caracteres..: %d", longitud);
  28.    
  29.     return 0;
  30. }
  31.  
  32.  
  33. char * fgets_fix(char * buff, size_t bufflen, FILE * fp){
  34.     if (fgets(buff, bufflen, fp) != NULL){  // Devolverá NULO si hay un error.
  35.         char * nw = NULL;                   // Se crea un puntero nulo.
  36.         nw = strchr(buff, '\n');            // strchr busca en la variable buff el carácter \n y devuelve
  37.                                             // la posición en la memoria donde está ese carácter.
  38.      
  39.         if (nw != NULL){                    // Verificamos que nw tenga valor después de usar el strchr
  40.             *nw = '\0';                     // Le asigamos a la dirección encontrada \0 que antes valía \n
  41.         }
  42.        
  43.         return buff;
  44.     }
  45.     return NULL;
  46. }

Saludos.
Daniel
  #7 (permalink)  
Antiguo 14/12/2013, 13:54
RoDaVi
Invitado
 
Mensajes: n/a
Puntos:
De acuerdo Respuesta: Arreglos,punteros y sprintf.-

Hola a todos.
Bueno al fin pude completarlo, lo dejo para que me digan en que puedo mejorarlo y tal vez alguien se pueda beneficiar con algunas líneas.-

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX 30
  6.  
  7. char * fgets_fix(char * buff, size_t bufflen, FILE * fp);
  8. void mostrar(const char IngPN[], const char IngSN[], const int orden);
  9.  
  10. int main(void){
  11.     char nombre_completo[93], *ptrNC = nombre_completo,
  12.          primer_nombre[MAX],  *ptrPN = primer_nombre,
  13.          segundo_nombre[MAX], *ptrSN = segundo_nombre,
  14.          apellido[MAX], *ptrAP = apellido;
  15.     int orden = 0; 
  16.          
  17.     do{
  18.         system("cls");
  19.         printf("\n\n Ingrese primer nombre.....: ");
  20.         fgets_fix(ptrPN, MAX, stdin);
  21.     }while(strlen(ptrPN) == 0);
  22.    
  23.     orden++;
  24.     do{
  25.         mostrar(ptrPN, ptrSN, orden);
  26.         printf("\n Ingrese segundo nombre....: ");
  27.         fgets_fix(ptrSN, MAX, stdin);
  28.     }while(strlen(ptrSN) == 0);
  29.    
  30.     orden++;
  31.     do{
  32.         mostrar(ptrPN, ptrSN, orden);
  33.         printf("\n Ingrese apellido..........: ");
  34.         fgets_fix(ptrAP, MAX, stdin);
  35.     }while(strlen(ptrAP) == 0);
  36.  
  37.     sprintf(ptrNC, "%s %s %s", ptrPN, ptrSN, ptrAP);
  38.    
  39.     printf("\n El nombre completo es: %s\n", ptrNC);
  40.    
  41.     return 0;
  42. }
  43.  
  44.  
  45. char * fgets_fix(char * buff, size_t bufflen, FILE * fp){
  46.     if (fgets(buff, bufflen, fp) != NULL){  // Devolverá NULO si hay un error.
  47.         char * nw = NULL;                   // Se crea un puntero nulo.
  48.         nw = strchr(buff, '\n');            // strchr busca en la variable buff el carácter \n y devuelve
  49.                                             // la posición en la memoria donde está ese carácter.
  50.      
  51.         if (nw != NULL){                    // Verificamos que nw tenga valor después de usar el strchr
  52.             *nw = '\0';                     // Le asigamos a la dirección encontrada \0 que antes valía \n
  53.         }
  54.        
  55.         return buff;
  56.     }
  57.     return NULL;
  58. }
  59.  
  60. void mostrar(const char IngPN[], const char IngSN[], const int orden){
  61.     system("cls");
  62.     if(orden == 1){
  63.         printf("\n\n Ingrese primer nombre.....: %s", IngPN);
  64.     }
  65.     if(orden == 2){
  66.         printf("\n\n Ingrese primer nombre.....: %s", IngPN);
  67.         printf("\n Ingrese segundo nombre....: %s", IngSN);
  68.     }
  69. }

Saludos y muchas gracias por tu tiempo guzzano.-

Saludos.
Daniel

Última edición por RoDaVi; 15/12/2013 a las 07:44

Etiquetas: int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:01.