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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Array de cadenas por teclado en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Array de cadenas por teclado en C  (Leído 3,082 veces)
Raymond Carver

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Array de cadenas por teclado en C
« en: 11 Junio 2014, 19:27 pm »

Hola, soy un principiante de programación en C (no se nada de C++) y ya me hacía falta conseguir un foro para poder despejar dudas. Les ruego tengan paciencia.

La cuestión es que aprendí a hacer arrays de cadenas pero no logro que me las tome por teclado usando un solo array de caracteres, y de echo es bastante curioso el resultado que me da.

Pongo el caso en que la salida es la esperada, usando tres arrays para capturar las cadenas:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {char *a[2];
  5. char letra0[50];
  6. char letra1[50];
  7. char letra2[50];
  8.  
  9. a[0]=gets(letra0);
  10.  
  11. a[1]=gets(letra1);
  12.  
  13. a[2]=gets(letra2);
  14.  
  15. printf("a[0]=%s  \n",a[0]);
  16. printf("a[1]=%s  \n",a[1]);
  17. printf("a[2]=%s  \n",a[2]);
  18. }

Compilo, le ingreso como datos "cadena0", "cadena1", "cadena2", y como resultado obtengo:
a[0]=cadena0
a[1]=cadena1
a[2]=cadena2
Lo cual es perfectamente lo esperado.

Ahora en cambio uso solo el array "letra" para capturar el ingreso, de esta forma:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {char *a[2];
  5. char letra[50];
  6.  
  7. a[0]=gets(letra);
  8.  
  9. a[1]=gets(letra);
  10.  
  11. a[2]=gets(letra);
  12.  
  13. printf("a[0]=%s  \n",a[0]);
  14. printf("a[1]=%s  \n",a[1]);
  15. printf("a[2]=%s  \n",a[2]);
  16. }
Ahora compilo, le ingreso los mismo que en el caso anterior, pero el resultado es:
a[0]=cadena2
a[1]=cadena2
a[2]=cadena2
O sea, en todas las posiciones de a me asignó el último ingreso. Realmente me desconcierta. Si hubiese copiado el primer ingreso, tal vez sospecharía que el problema es con el gets (de echo lo probé con scanf y pasa lo mismo), pero ¿¿¿el último??? O sea, no entiendo como al pedir el último dato, haciendo a[2]=gets(letra) puede ser que a lo que toma desde el teclado lo asigne a los tres a sin llamar a la asignación.

Desde ya muchas gracias al que me ayude.


En línea

JorgeEMX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.615



Ver Perfil WWW
Re: Array de cadenas por teclado en C
« Respuesta #1 en: 11 Junio 2014, 20:46 pm »

Es normal, ya que lo que está guardando gets es lo último que escribiste. En todo caso, deberías usar arreglos multidimensionales:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.        char letra[2][100];
  6.  
  7.        gets(letra[0]);
  8.  
  9.        gets(letra[1]);
  10.  
  11.        gets(letra[2]);
  12.  
  13.        printf("letra[0]=%s  \n",letra[0]);
  14.        printf("letra[1]=%s  \n",letra[1]);
  15.        printf("letra[2]=%s  \n",letra[2]);
  16. }
  17.  


En línea

Raymond Carver

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Array de cadenas por teclado en C
« Respuesta #2 en: 11 Junio 2014, 21:04 pm »

Claro, así también lo podría haber pensado, pero yo quería hacerlo con un array de cadenas y un array de caracteres.

O sea, no entiendo por qué en la forma en que lo hice no lo toma. Por ejemplo, cuando hago:

1- a[0]=gets(letra);

2- a[1]=gets(letra);

En 1, ¿no estaría tomando la entrada del teclado, y asignándosela a a[0]?
Haciendo letra="cadena desde el teclado"
              a[0]=letra

En 2, ¿no tomaría una segunda entrada y asignándosela a a[1]?
Haciendo letra="nueva cadena desde el teclado"
              a[1]=letra

Acá lo modifiqué un poco a lo que había echo. Lo pruebo y me muestra correctamente los datos luego de cada pedido, pero mal al final. O sea, al principio pido que se escriba "cadena0", se asigna a letra, se asigna letra a a[0], y se muestran letra y cadena[0] correctamente. Se hace eso con las tres a. Pero al final cuando las imprime todas las muestra como "cadena2" a las tres (o sea, la última entrada escrita). No llego a entender por qué reescribe las dos primeras a.
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {char *a[2];
  5. char letra[50];
  6.  
  7. puts("Ingrese cadena0:");
  8. a[0]=gets(letra);
  9. puts(letra);
  10. printf("a[0]=%s \n\n",a[0]);
  11.  
  12. puts("Ingrese cadena1:");
  13. a[1]=gets(letra);
  14. puts(letra);
  15. printf("a[1]=%s \n\n",a[1]);
  16.  
  17. puts("Ingrese cadena2:");
  18. a[2]=gets(letra);
  19. puts(letra);
  20. printf("a[2]=%s \n\n",a[2]);
  21.  
  22. puts("Ahora mostramos todos los a");
  23. printf("a[0]=%s  \n",a[0]);
  24. printf("a[1]=%s  \n",a[1]);
  25. printf("a[2]=%s  \n",a[2]);
  26. }
« Última modificación: 11 Junio 2014, 21:20 pm por Raymond Carver » En línea

JorgeEMX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.615



Ver Perfil WWW
Re: Array de cadenas por teclado en C
« Respuesta #3 en: 11 Junio 2014, 22:15 pm »

Tiene que ver con el manejo de punteros, al final... los 3 punteros de "a" terminan apuntando al mismo valor de "letra".
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Array de cadenas por teclado en C
« Respuesta #4 en: 11 Junio 2014, 23:05 pm »

........................................

Acá lo modifiqué un poco a lo que había echo. Lo pruebo y me muestra correctamente los datos luego de cada pedido, pero mal al final. O sea, al principio pido que se escriba "cadena0", se asigna a letra, se asigna letra a a[0], y se muestran letra y cadena[0] correctamente. Se hace eso con las tres a. Pero al final cuando las imprime todas las muestra como "cadena2" a las tres (o sea, la última entrada escrita). No llego a entender por qué reescribe las dos primeras a.
...........................


Como tan acertadamente apunta JorgeEMX los tres  punteros "a" apuntan a la dirección de "letra" y a medida que introduces un nuevo valor de "letra" con gets estas "actualizando" la dirección, y por tanto el valor al que apuntan, de los punteros anteriores.

Lo veras mejor si imprimes el puntero del gets y los anteriores. De esa manera veras mejor como se actualizan cada vez que usas el gets los valores a los que apuntan  los punteros:

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  char *a[2];
  5.  char letra[50];
  6.  puts("Ingrese cadena0:");
  7.  a[0]=gets(letra);
  8.  printf("a[0]=%s  \n",a[0]);
  9.  
  10.  puts("Ingrese cadena1:");
  11.  a[1]=gets(letra);
  12.  printf("a[0]=%s  \n",a[0]);
  13.  printf("a[1]=%s  \n",a[1]);
  14.  
  15.  puts("Ingrese cadena2:");
  16.  a[2]=gets(letra);
  17.  printf("a[0]=%s  \n",a[0]);
  18.  printf("a[1]=%s  \n",a[1]);
  19.  printf("a[2]=%s  \n",a[2]);
  20.  return 0;
  21. }

Citar
Ingrese cadena0:
111
a[0]=111
Ingrese cadena1:
222
a[0]=222
a[1]=222
Ingrese cadena2:
333
a[0]=333
a[1]=333
a[2]=333

Process returned 0 (0x0)

Como ves los valores se han ido actualizando en cada gets.

¡¡¡¡ Saluditos! ..... !!!!


« Última modificación: 11 Junio 2014, 23:06 pm por leosansan » En línea

Raymond Carver

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Array de cadenas por teclado en C
« Respuesta #5 en: 11 Junio 2014, 23:12 pm »

Claro claro, ahora entiendo donde está el error. Cuando hago a[0]=gets(letra) no le estoy asignando al puntero el valor de "letra" (en este caso sería la cadena), sino que le estoy asignando su dirección de memoria. Son punteros, no guardan valores, guardan direcciones.

Son esas cosas que uno supuestamente ya sabe pero hasta que no se equivoca mil veces no se acostumbra a tener en cuenta.

¡Muchas gracias por ayudarme!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Array de cadenas por teclado en C
« Respuesta #6 en: 12 Junio 2014, 02:50 am »

Solo para redondear el tema:

1) Cuando se declara un array se indica el numero de elementos y se accede a ellos mediante los indices 0 .. N-1 ya que en C los indices inician en cero. Con esta declaración:
Código
  1. char *a[2];
Declaras un array de dos elementos y se accede a ellos mediante los indices 0 y 1, al utilizar en el programa "a[2]" este puede reventar (comportamiento no definido).

2) No tiene caso (ya que no hay validaciones) almacenar el valor de retorno de la función gets ya que esta retorna el argumento pasado o bien NULL en caso de error.

3) No se recomienda el uso de gets, si apenas empiezas tu aprendizaje del lenguaje C por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Copiar parte de una array a otra array
Programación Visual Basic
sircid 3 5,277 Último mensaje 19 Diciembre 2007, 11:27 am
por LeandroA
Fallo de segmentacion con fgets y Array de cadenas. « 1 2 »
Programación C/C++
samur88 12 7,132 Último mensaje 7 Marzo 2011, 00:37 am
por samur88
[AYUDA] Separar array en cadenas
PHP
Graphixx 0 1,549 Último mensaje 8 Mayo 2013, 03:06 am
por Graphixx
Problema con for y array de cadenas.
Programación C/C++
jomag 3 2,241 Último mensaje 7 Febrero 2014, 02:18 am
por jomag
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines