[C] Funcion regresa array de caracteres

Iniciado por edr89, 9 Octubre 2013, 05:59 AM

0 Miembros y 1 Visitante están viendo este tema.

edr89

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:

/*Que debe regresar?*/ input_nombre()
{
    char nombre[20];
    int longitud=0;
    do
    {
        printf("Persona 1: ");
        scanf("%s",&nombre);
            while (getchar() != '\n');
        longitud = strlen(nombre);
        if(longitud>20)
        {
            printf("\nError, el nombre no puede ser mayor a 20 caracteres\n\n");
        }

    }while(longitud>20);
    return //El nombre de la persona
}


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

rir3760

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:
#include <stdio.h>
#include <stdlib.h>

char *input_nombre(size_t long_max);

int main(void)
{
   char *nombre;
   
   if ((nombre = input_nombre(256)) != NULL){
      printf("Hola %s\n", nombre);
      free(nombre);
   }
   
   return EXIT_SUCCESS;
}

char *input_nombre(size_t long_max)
{
   char *nombre;
   
   if ((nombre = malloc(long_max + 1)) != NULL){
      printf("Indica el nombre: ");
      fflush(stdout);
      if (fgets(nombre, long_max, stdin) == NULL){
         free(nombre);
         nombre = NULL;
      }else {
         size_t i;
         
         for (i = 0; nombre[i] != '\0' && nombre[i] != '\n'; i++)
            ;
         if (nombre[i] == '\n')
            nombre[i] = '\0';
         else {
            int ch;
           
            while ((ch = getchar()) != EOF && ch != '\n')
               ;
         }
      }
   }

   return nombre;
}


Un saludo
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

y que pasa si resumo la funcion a esto:
#include <stdio.h>
#include <stdlib.h>

char *input_nombre();

int main(void)
{
    char *nombre;
    nombre = input_nombre();
    printf("Hola %s\n", nombre);
    return EXIT_SUCCESS;
}

char *input_nombre()
{
    char *nombre;
    printf("Indica el nombre: ");
    fgets(nombre, 30, stdin);
    return nombre;
}


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:

eferion

char *input_nombre()
{
    char *nombre;
    printf("Indica el nombre: ");
    fgets(nombre, 30, stdin);
    return nombre;
}


Por pasar pasa lo siguiente:

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.