Ir al contenido


Foto

Funcion de ingresos de string por teclado y guardarlos en un vector. Ayuda!


  • Por favor identifícate para responder
2 respuestas en este tema

#1 m1kevil

m1kevil

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 31 agosto 2012 - 01:37


cpp
  1. // Funcion para definir nombres de los jugadores y quien empieza primero //
  2. int TurnoInicial (int Jugadores)
  3. {
  4.     char vec[Jugadores];
  5.     int i;   
  6.     for (i=0; i<Jugadores; i++)
  7.     {
  8.             printf("Ingrese el nombre del jugador %d: ", i+1);
  9.             scanf ("%s", &vec[i]);
  10.     }
  11.     for (i=0; i<Jugadores; i++)
  12.     {
  13.             printf("El jugador %d se llama: %s\n", i+1, vec[i]); 
  14.     }
  15.    
  16. }


Buenas! Estoy desarrollando un juego simple en C "puro" y necesito que luego de determinar la cantidad de jugadores que participaran del juego, una funcion sea capaz de almacenar los nombres de los jugadores (ingresados por teclado), y guardalos en un vector de la cantidad de posiciones de la variable 'Jugadores'.
Este vector será utilizado luego para desplegar el nombre del jugador en el momento que le toque su turno de tirar los dados por ejemplo.

Con el código expuesto arriba, funciona bien hasta que ingreso el ultimo nombre por teclado. Luego el programa se cuelga. Pienso que el problema radica en la funcion scanf y en el %s . Quizas otro método de entrada para los strings funcione mejor en este caso, pero es la primera vez que manejo cadenas de caracteres en C.

Por favor agradecería que me dieran una mano!
Desde ya muchas gracias!
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 septiembre 2012 - 11:47

Bienvenido a delphiacces  m1kevil.

Dudo que el código que expones compile tal como esta publicado pues no puedes definir un array estático de un tamaño definido por una variable.

Una primera aproximación a tu problema sería definir un array de dos dimensiones, una para el número máximo de jugadores admitidos y otra para el tamaño de los nombres. Si ese array lo defines como variable global lo conocerán todas las funciones de tu juego.

Este sería el ejemplo descrito:


cpp
  1. char Nombres[5][41];  // Cinco jugadores 40 caracteres por nombre (mas el nulo final)
  2.  
  3. int TurnoInicial (int Jugadores)
  4. {
  5.   int i;
  6.   char Buffer[1024];  // Buffer para la entrada por teclado.
  7.  
  8.   for(i = 0; i < Jugadores; i++){
  9.     printf("Ingrese el nombre del jugador %d: ", i+1);
  10.     strncpy(Nombres[i], gets(Buffer), 40);  // aseguramos que no entran mas de 40 caracteres
  11.   }
  12.   for(i = 0; i < Jugadores; i++){
  13.     printf("El jugador %d se llama: %s\n", i+1, Nombres[i]);
  14.   }
  15. }


El siguiente paso sería definir un array dinámico en lugar de estático, esto complica un poquito mas el código y en este caso no debería ser necesario.


Saludos.
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 septiembre 2012 - 01:35

Una variante de la función anterior, mas segura para el desbordamiento de buffer:


cpp
  1. // Funcion para definir nombres de los jugadores //
  2. void ingresarNombres (int Jugadores)
  3. {
  4.   int i, n;
  5.   for(i = 0; i < Jugadores; i++){
  6.     printf("Ingrese el nombre del jugador %d: ", i+1);
  7.     n = strlen(fgets(Nombres[i], 40, stdin))-1;
  8.     if(Nombres[i][n] == '\n') Nombres[i][n] = 0;
  9.   }
  10.   for(i = 0; i < Jugadores; i++){
  11.     printf("El jugador %d se llama: %s\n", i+1, Nombres[i]);
  12.   }
  13. }



Saludos.
  • 0




IP.Board spam blocked by CleanTalk.