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)
| | |-+  Arreglos de cadenas en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arreglos de cadenas en C  (Leído 3,721 veces)
024mc

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Arreglos de cadenas en C
« en: 2 Junio 2020, 00:02 am »

Hola
Cómo puedo crear un arreglo para guardar nombres de personas con espacios, dados por teclado?



« Última modificación: 2 Junio 2020, 00:04 am por 024mc » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #1 en: 2 Junio 2020, 01:53 am »

Una cadena con espacios tiene la misma representación que una sin espacios ya que un espacio también es un char.
La cadena la puedes reservar de forma estática:
Código
  1. #define SIZE 50
  2. char cadena[50];
O de forma dinámica:
Código
  1. #define SIZE 50
  2. char *cadena = (char*)malloc(SIZE * sizeof(char));
Recuerda que si lo haces de forma dinámica, luego tienes que liberar la memoria reservada:
Código
  1. free(cadena);

Para poder guardar espacios lo importante es usar la función fgets() en vez de scanf().
Código
  1. fgets(cadena, SIZE, stdin);
Esto guardará el ENTER que pulses al final como parte de la cadena (siempre que no hayas llegado a los SIZE-1 caracteres, ya que el último se reserva para el carácter de fin de cadena '\0'). Para eliminar el salto de línea producido por el ENTER:
Código
  1. if(cadena[strlen(cadena)-1] == '\n')
  2.  cadena[strlen(cadena)-1] = '\0';


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #2 en: 2 Junio 2020, 03:17 am »

Y si quiero meter varias cadenas a un mismo arreglo?
Lo que sucede es que estoy intentando llenar un arreglo con datos que ya tengo en una estructura y en este caso solo necesito llenarlo con los nombres.
Mas o menos tendría un opción en donde se pediría que nombres quiero meter al arreglo y conforme me los vaya ingresando la persona, se iría llenando el array.
« Última modificación: 2 Junio 2020, 03:20 am por michellcrh » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #3 en: 2 Junio 2020, 03:35 am »

Ah vale, creo que te había entendido mal.

Si lo que quieres es un arreglo de cadenas y una cadena es un arreglo, lo que tienes al final es un arreglo de arreglos, es decir, un arreglo bidimensional o matriz.
Si lo que intentas es meter diferentes nombres en la misma cadena y separarlos solo por un espacio, si los nombres son independientes, creo que sería mejor opción una matriz en la que cada fila es un nombre.

Si por lo que sea quieres juntar todos los nombres en la misma cadena tendrías que copiar un nombre en la cadena final, insertar un espacio, copiar otro nombre,...

No sé si es eso a lo que te refieres ni dónde tienes exactamente el problema. Si para crear la cadena, para introducir las otras cadenas, para introducir los espacios... :huh: :huh:
Si no es eso, seguramente sea más sencillo si pones un ejemplo concreto de código.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #4 en: 2 Junio 2020, 03:44 am »

Te lo agradezco mucho, mas o menos esta es la funcion que quería hacer pero no logro que conforme me vaya digitando el numero del nombre que desea meter al arreglo, este se vaya llenando.

Código
  1. void mostrarNombres(Persona *personas, int numeroPersonas){
  2.    int opcion,opc;
  3.    char arregloPersonas[50][LIMITE]; // limite = 100
  4.    do{
  5.        for(int i = 0; i < numeroPersonas; i++){
  6.    printf("%d Nombre: %s\n", i+1,personas[i].nombre);
  7.    printf("\n\n");
  8.   }
  9.  
  10.   printf(" Ingrese el numero correspondiente al nombre que desea: ");
  11.       scanf("%d",&opcion);
  12.  
  13.       for(int j=0; j<numeroLibros; j++){
  14.           if(opcion == j+1){
  15.               //En este caso la persona con el numero que ingrese deberia guardarse en el arreglo, y es lo que no funciona
  16.               //personas[j].nombre
  17.  
  18.           }
  19.       }
  20.  
  21.       printf(" Desea agregar otro nombre?, 1 = SI , 2 = NO: ");
  22.       scanf("%d",&opc);
  23.       system("cls");
  24.    }while(opc == 1);
  25.    if(opc == 2){
  26.        printf("\nNOMBRES AGREGADOS:\n");
  27.        for(int i=0; i<numeroPersonas;i++){
  28.             printf("%s\n",arregloPersonas[i]);
  29.        }
  30.  
  31.    }
  32.    else{
  33.        printf("ERROR, OPCION NO VALIDA");
  34.    }
  35.  
  36.  
  37.  
  38. }
En línea

ErahUnderground

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #5 en: 3 Junio 2020, 16:28 pm »

¿Puede ser que no tengas declarada la variable 'numeroLibros'?

No sé si entiendo bien el ejercicio, pero si por ejemplo el número de libros de una persona está dentro de tu array de estructuras personas tendrías que hacer el for de la j así:

Código
  1. for(int j=0; j<personas[opcion].numeroLibros; j++)

A parte de eso, date cuenta que estás seleccionando a una persona y después estás buscando una opción (que es la persona) e intentandola comparar con el número del libro.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #6 en: 3 Junio 2020, 19:51 pm »

Te lo agradezco mucho, mas o menos esta es la funcion que quería hacer pero no logro que conforme me vaya digitando el numero del nombre que desea meter al arreglo, este se vaya llenando.

Código
  1. void mostrarNombres(Persona *personas, int numeroPersonas){
  2.    int opcion,opc;
  3.    char arregloPersonas[50][LIMITE]; // limite = 100
  4.    do{
  5.        for(int i = 0; i < numeroPersonas; i++){
  6.    printf("%d Nombre: %s\n", i+1,personas[i].nombre);
  7.    printf("\n\n");
  8.   }
  9.  
  10.   printf(" Ingrese el numero correspondiente al nombre que desea: ");
  11.       scanf("%d",&opcion);
  12.  
  13.       for(int j=0; j<numeroLibros; j++){
  14.           if(opcion == j+1){
  15.               //En este caso la persona con el numero que ingrese deberia guardarse en el arreglo, y es lo que no funciona
  16.               //personas[j].nombre
  17.  
  18.           }
  19.       }
  20.  
  21.       printf(" Desea agregar otro nombre?, 1 = SI , 2 = NO: ");
  22.       scanf("%d",&opc);
  23.       system("cls");
  24.    }while(opc == 1);
  25.    if(opc == 2){
  26.        printf("\nNOMBRES AGREGADOS:\n");
  27.        for(int i=0; i<numeroPersonas;i++){
  28.             printf("%s\n",arregloPersonas[i]);
  29.        }
  30.  
  31.    }
  32.    else{
  33.        printf("ERROR, OPCION NO VALIDA");
  34.    }
  35. }

Como te ha dicho @ErahUnderground, la variable numeroLibros que utilizas no aparece definida en ningún sitio.
Me da la sensación de que querías usar numeroPersonas ya que tiene más sentido así que mi respuesta irá por esa línea.

Daré por hecho que numeroPersonas contiene la cantidad de personas almacenadas en el array personas. Entonces te falta otro índice para ir guardando en arregloPersonas ya que si no usas otro índice guardarás a la persona 40 en la fila 40 y habrás desperdiciado las anteriores filas de arregloPersonas.
El resultado sería:
Código
  1. void mostrarNombres(Persona *personas, int numeroPersonas){
  2.    int opcion;
  3.    int indicePersona; // indice de la persona a guardar
  4.    char arregloPersonas[50][LIMITE]; // limite = 100
  5.    int personasGuardadas = 0; // personas guardadas en arregloPersonas
  6.  
  7.    do {
  8.        // Otro bucle para evitar que se introduzca un indice fuera de los limites permitidos
  9.        do {
  10.            printf("Numero de la persona a almacenar [%d - %d]: ", 1, numeroPersonas);
  11.            scanf("%d", &indicePersona);
  12.        } while(indicePersona < 1 || indicePersona > numeroPersonas);
  13.  
  14.        // Ahora no tenemos que recorrer el bucle, accedemos directamente al indice:
  15.        // Para copiar cadenas, usa strncpy:
  16.        strncpy(arregloPersonas[personasGuardadas], personas[indicePersona-1], LIMITE); // Al segundo le restamos 1 porque pedimos un indice empezado en 1 pero los arrays en C empiezan en 0.
  17.        arregloPersonas[personasGuardadas][LIMITE-1] = '\0'; // Para curarme en salud y asegurarme que la cadena tiene un caracter de fin de cadena
  18.        ++personasGuardadas;
  19.  
  20.        // Si no hemos llegado al limite, le dejamos al usuario elegir:
  21.        if(personasGuardadas < 50){
  22.            // Otro bucle para que la opcion sea 1 o 2:
  23.            do {
  24.                printf("Guardar otro nombre (1 = Si / 2 = No): ");
  25.                scanf("%d", &opcion);
  26.            } while(opcion != 1 && opcion != 2);
  27.        }
  28.    } while(personasGuardadas < 50 && opcion == 1);
  29.  
  30.    // Aqui ya puedes mostrar los nombres guardados usando como limite <personasGuardadas>:
  31.    printf("Los nombres guardados son:\n");
  32.    for(int i = 0; i < personasGuardadas; ++i){
  33.        printf("%s\n", arregloPersonas[i]);
  34.    }
  35. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
michellcrh

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Arreglos de cadenas en C
« Respuesta #7 en: 4 Junio 2020, 04:14 am »

Te lo agradezco mucho, me ayudó bastante.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
con arreglos
Java
artang 0 2,239 Último mensaje 31 Marzo 2009, 04:54 am
por artang
arreglos en c
Programación C/C++
el futuro 5 3,453 Último mensaje 21 Mayo 2010, 02:08 am
por @synthesize
arreglos de cadenas
Java
sauce19 5 4,275 Último mensaje 5 Agosto 2011, 11:11 am
por Debci
Almacenar cadenas en arreglos de bytes
Java
m@o_614 1 4,633 Último mensaje 13 Enero 2015, 02:09 am
por madara1412
Arreglos y Cadenas de caracteres AYUDA
Programación C/C++
samantika 2 1,980 Último mensaje 5 Septiembre 2015, 04:28 am
por d91
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines