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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


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

Desconectado Desconectado

Mensajes: 105


Ver Perfil
[C] Funcion regresa array de caracteres
« en: 9 Octubre 2013, 05:59 am »

Hola, tengo una función que pide el nombre de una persona, quiero que regrese el arreglo de caracteres para que en main se haga uso del nombre tecleado. Hay un tema donde usan apuntadores, he tratado de adaptarlo a mi funcion pero me da error, algo estoy haciendo mal:

Código
  1. /*Que debe regresar?*/ input_nombre()
  2. {
  3.    char nombre[20];
  4.    int longitud=0;
  5.    do
  6.    {
  7.        printf("Persona 1: ");
  8.        scanf("%s",&nombre);
  9.            while (getchar() != '\n');
  10.        longitud = strlen(nombre);
  11.        if(longitud>20)
  12.        {
  13.            printf("\nError, el nombre no puede ser mayor a 20 caracteres\n\n");
  14.        }
  15.  
  16.    }while(longitud>20);
  17.    return //El nombre de la persona
  18. }

Eventualmente voy a guardar el nombre en una estructura en su campo nombre[20]  :huh:


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Funcion regresa array de caracteres
« Respuesta #1 en: 9 Octubre 2013, 06:31 am »

Debes reservar un bloque de memoria del tamaño adecuado mediante la función malloc, calloc o realloc, leer y almacenar ahí el nombre y finalmente retornar la dirección en memoria de dicho bloque.

Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *input_nombre(size_t long_max);
  5.  
  6. int main(void)
  7. {
  8.   char *nombre;
  9.  
  10.   if ((nombre = input_nombre(256)) != NULL){
  11.      printf("Hola %s\n", nombre);
  12.      free(nombre);
  13.   }
  14.  
  15.   return EXIT_SUCCESS;
  16. }
  17.  
  18. char *input_nombre(size_t long_max)
  19. {
  20.   char *nombre;
  21.  
  22.   if ((nombre = malloc(long_max + 1)) != NULL){
  23.      printf("Indica el nombre: ");
  24.      fflush(stdout);
  25.      if (fgets(nombre, long_max, stdin) == NULL){
  26.         free(nombre);
  27.         nombre = NULL;
  28.      }else {
  29.         size_t i;
  30.  
  31.         for (i = 0; nombre[i] != '\0' && nombre[i] != '\n'; i++)
  32.            ;
  33.         if (nombre[i] == '\n')
  34.            nombre[i] = '\0';
  35.         else {
  36.            int ch;
  37.  
  38.            while ((ch = getchar()) != EOF && ch != '\n')
  39.               ;
  40.         }
  41.      }
  42.   }
  43.  
  44.   return nombre;
  45. }

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
edr89

Desconectado Desconectado

Mensajes: 105


Ver Perfil
Re: [C] Funcion regresa array de caracteres
« Respuesta #2 en: 9 Octubre 2013, 07:07 am »

y que pasa si resumo la funcion a esto:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *input_nombre();
  5.  
  6. int main(void)
  7. {
  8.    char *nombre;
  9.    nombre = input_nombre();
  10.    printf("Hola %s\n", nombre);
  11.    return EXIT_SUCCESS;
  12. }
  13.  
  14. char *input_nombre()
  15. {
  16.    char *nombre;
  17.    printf("Indica el nombre: ");
  18.    fgets(nombre, 30, stdin);
  19.    return nombre;
  20. }
  21.  

 Al compilar corre y da el nombre, no va a validar el tamaño pero me di cuenta que con fgets solo imprime 30 caracteres, el resto no se sobreescribe en memoria o si?  :huh:
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [C] Funcion regresa array de caracteres
« Respuesta #3 en: 9 Octubre 2013, 08:53 am »

Código
  1. char *input_nombre()
  2. {
  3.    char *nombre;
  4.    printf("Indica el nombre: ");
  5.    fgets(nombre, 30, stdin);
  6.    return nombre;
  7. }

Por pasar pasa lo siguiente:

Código
  1. char * nombre;

Declaras un puntero de tipo char... pero el puntero apunta a... ... exacto!!! a ninguna parte. Bueno, realmente sí apunta a algún sitio, por eso es puntero, lo que sucede es que apunta a una dirección de memoria que, en el mejor de los casos, no te pertenece. Y sí, esto implica que cualquier escritura sobre el puntero puede desembocar en violación de segmento o en otros problemas de graves consecuencias.

NUNCA se te ocurra utilizar un puntero sin inicializar... lo mejor que te puede pasar es que la aplicación finalice con error... lo peor es que corrompas datos de otra aplicación y pierdas datos importantes.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines