Jump to content


Photo

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


  • Please log in to reply
2 replies to this topic

#1 m1kevil

m1kevil

    Newbie

  • Miembros
  • Pip
  • 1 posts

Posted 31 August 2012 - 01:37 PM


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
  • 4107 posts
  • LocationMadrid - España

Posted 01 September 2012 - 11:47 AM

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
  • 4107 posts
  • LocationMadrid - España

Posted 01 September 2012 - 01:35 PM

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.