0

estoy presentando problemas a la hora de entender como llenar un arreglo de caracteres en C e imprimir esos datos ingresados, me gustaría saber cual es la forma adecuada de trabajarlo ya que a la hora de compilar solo me arroja un solo elemento del arreglo.

#include <stdio.h>

int main() {            
    char nombre[30];
    int i = 0;
                        
    printf("\t\t------------FishCool Enterprises--------------\n");
    printf("\n\tBienvenido Usuario a continuacion se le pedira que ingrese los nombres de los empleados activos");

    while (i < 3){
        printf("\nIngrese el nombre: ");
        scanf("%s", &nombre);
        i++;
    }
                    
    printf("Los nombres ingresados son %s", nombre);
}
Trauma
  • 25,297
  • 4
  • 37
  • 60
  • lo que tu conoces como string en C no existe, un *string* es un array de caracteres, por ejempl, si tienes `char name = "christian"` la variable `nombre` es un array. Lo que en realidad guardas en tu variable `nombre` es un array por lo que al final tienes un array de arrays – Christian Jul 27 '21 at 18:46

2 Answers2

2

Esta declaración:

char nombre[30];

Le indica al compilador: "Oye, reserva memoria para un array de 30 elementos". Lo que pasa es que en ese array solo puedes almacenar únicamente un nombre. El array puede estar reflejado así en memoria:

------ Array "nombre" -------
0x0A | 0x0B  | 0x0C | 0x0D   ... | N direcciones
J       U       A      N     ... | data..

Como podrás ver, en cada dirección de memoria se guarda un caracter de algún nombre, por lo que un simple array unidimensional no es suficiente en este caso, ¡necesitas un array bidimensional!

Si sabemos la cantidad de empleados, podemos usar un array bidimensional con tamaño estático:

#include <stdio.h>

int main() 
{         
    //Acá podremos almacenar 100 nombres de empleados pero la longitud del nombre del empleado debe ser hasta 30 caracteres...
    char nombres[100][30];
    int i = 0;
                       
    printf("\t\t------------FishCool Enterprises--------------\n");
    printf("\n\tBienvenido Usuario a continuacion se le pedira que ingrese los nombres de los empleados activos");

    while (i < 3)
    {
        printf("\nIngrese el nombre: ");
        scanf("%s", nombres[i]);
        i++;
    }
    
    i = 0; //Rayos... otra vez debo volver a inicializar esta variable, que pasa si me olvido?
    //Imprimimos los nombres...
    while(i < 3)
    {
        printf("%s\n", nombres[i]);
        i++;
    }
}

Observaciones

1. Si vas a usar la función scanf para leer cadenas, al menos debes especificar el tamaño del array para evitar un desbordamiento de búfer.

Ejemplo:

scanf("%29s", nombres[i]);

Puedes encontrar mas información en este hilo.

O también puedes usar la función fgets, es útil cuando los nombres tienen espacio.

2. Trata de minimizar el ciclo de vida de las variables (en tu caso, es la variable i), de este modo no necesitarás volver a inicializar la variable cuando la necesites usar.

Por ejemplo:

int main() 
{         
    char nombres[100][30];
                 
    printf("\t\t------------FishCool Enterprises--------------\n");
    printf("\n\tBienvenido Usuario a continuacion se le pedira que ingrese los nombres de los empleados activos");
    
    //La variable "i" solo es visible en este for..
    for(int i = 0; i < 3; i++)
    {
        printf("\nIngrese el nombre: ");
        scanf("%29s", nombre[i]);
    }
    
    //La variable "i" solo es visible en este for..
    for(int i = 0; i < 3; i++)
    {
        printf("%s\n", nombre[i]);
    }
}

Nota

Si necesitas un array bidimensional cuyo tamaño debe ser dinámico, este hilo te puede servir.

MrDave1999
  • 7,491
  • 1
  • 7
  • 22
0

Para poder mostrar todos los nombres deberías hacer un bucle:

printf("Los nombres ingresados son:");
for(int i = 0, i < 3; i++) {
    printf("%s", nombre[i]);
    i++;
}
Fran Cámara
  • 736
  • 1
  • 3
  • 21