FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Código:
// Funcion para elegir la maxima puntuacion al ppio del juego // int ElegirPuntuacion () { char buffer [256]; do { printf("Ingrese la cantidad de presos que se permiten dejar escapar (50 a 200): "); fgets (buffer, 256, stdin); PuntuacionMax = atoi (buffer); } while (PuntuacionMax < 50 || PuntuacionMax > 200); printf("No podran escaparse mas de %d presos. Si esto ocurre, el jugador pierde. A Jugar! \n", PuntuacionMax); return PuntuacionMax; } Saludos!! Pueden cerrar el thread si quieren! |
#2
|
||||
|
||||
Hola m1kevil.
Gracias por acercarnos el resultado . Aprovecho para comentarte que en este caso es suficiente Código:
... char buffer[4]; do { fgets(buffer, 4, stdin); ... Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Es cierto. Gracias por tu aporte! Pero de todos modos prefiero dejar los 256, ya que si introducen una cadena de caracteres demasiado larga, no se produce ningun error. Es decir, la toma por stdin correctamente, y como no es un numero valido da 1 solo mensaje de error.
Me ha pasado de que cambiando el valor a 4 e introduciendo una cadena de caracteres demasiado larga, se repiten varias veces los mensajes. Es complicado de explicar.. corriendo el programa entenderas lo que digo. Muchas gracias de todas formas! |
#4
|
|||
|
|||
Código:
// Funcion para definir nombres de los jugadores y quien empieza primero // int TurnoInicial (int Jugadores) { char vec[Jugadores]; int i; for (i=0; i<Jugadores; i++) { printf("Ingrese el nombre del jugador %d: ", i+1); scanf ("%s", &vec[i]); } for (i=0; i<Jugadores; i++) { printf("El jugador %d se llama: %s\n", i+1, vec[i]); } } Bueno, siguiendo con este juego y los problemas... ahora 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! |
#5
|
||||
|
||||
Tu código tal como lo expones no puede compilar 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: Código:
char Nombres[5][41]; // Cinco jugadores 40 caracteres por nombre (mas el nulo final) int TurnoInicial (int Jugadores) { int i; char Buffer[1024]; // Buffer para la entrada por teclado. for(i = 0; i < Jugadores; i++){ printf("Ingrese el nombre del jugador %d: ", i+1); strncpy(Nombres[i], gets(Buffer), 40); // aseguramos que no entran mas de 40 caracteres } for(i = 0; i < Jugadores; i++){ printf("El jugador %d se llama: %s\n", i+1, Nombres[i]); } } |
#6
|
|||
|
|||
No sabes como te agradezco la ayuda Escafandra! Me estaba pelando las pestañas! Funciona de maravilla!!!
Código:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> int tirarDados (void); int transEntero (char); int cantJugadores (void); int elegirPuntuacion (void); char ingresarNombres (int); int Dados, Jugadores, puntuacionMax; int main () { char Nombres[Jugadores][40]; srand (time(NULL)); printf("!Bienvenidos al juego: EL PRESO!\n\n"); Jugadores = cantJugadores(); puntuacionMax = elegirPuntuacion(); Nombres[Jugadores][40] = ingresarNombres(Jugadores); tirarDados(); system("pause"); return EXIT_SUCCESS; } // Funcion para tirar los dados // int tirarDados (void) { Dados = rand() % 11+2; printf("Arrojas los dados. Has sacado %d! \n", Dados); return Dados; } // Funcion para pasar de char a entero // int transEntero(char s) { return s - '0'; } // Funcion para validar la cantidad de jugadores al principio del juego// int cantJugadores () { do { printf("Ingrese la cantidad de jugadores (2 a 5): "); Jugadores = transEntero(getche()); printf("\n"); } while (Jugadores < 2 || Jugadores > 5); printf("Los participantes del juego seran %d.\n\n", Jugadores); return Jugadores; } // Funcion para elegir la maxima puntuacion al ppio del juego // int elegirPuntuacion () { char buffer [256]; do { printf("Determine la cantidad de presos que se permiten dejar escapar (50 a 200): "); fgets (buffer, 256, stdin); puntuacionMax = atoi (buffer); } while(puntuacionMax < 50 || puntuacionMax > 200); printf("No podran escaparse mas de %d presos. Si esto ocurre, el jugador pierde. A Jugar!!! \n\n", puntuacionMax); return puntuacionMax; } // Funcion para definir nombres de los jugadores // char ingresarNombres (int Jugadores) { int i; char Nombres[Jugadores][40]; char Buffer[1024]; // Buffer para la entrada por teclado. for(i = 0; i < Jugadores; i++) { printf("Ingrese el nombre del jugador %d: ", i+1); strncpy(Nombres[i], gets(Buffer), 40); // aseguramos que no entran mas de 40 caracteres } for(i = 0; i < Jugadores; i++) { printf("El jugador %d se llama: %s\n", i+1, Nombres[i]); } return Nombres[Jugadores][40]; } Por favor avisame si tienes alguna solución para ese pequeño problema. Desde ya muchas gracias por tu tiempo, es justo lo que necesitaba. Es un gran avance para mi.. ahora tengo que planear mejor en lapiz y papel la lógica del juego. |
#7
|
||||
|
||||
Cita:
Para los valores constantes en toda la aplicación es mejor definirlos al principio, así los puedes cambiar fácilmente si es necesario. Mira esta adaptación de tu programa, en la que he modificado también la anterior función ingresarNombres para hacerla mas segura contra el desbordamiento de buffer: Código:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> #define MIN_JUGADORES 2 #define MAX_JUGADORES 5 #define MIN_PUNTUACION 50 #define MAX_PUNTUACION 200 #define MAX_NOMBRE 40 char Nombres[MAX_JUGADORES][MAX_NOMBRE + 1]; int tirarDados (void); int transEntero (char); int cantJugadores (void); int elegirPuntuacion (void); void ingresarNombres (int); int Dados, Jugadores, puntuacionMax; int main(int argc, char* argv[]) { srand (time(NULL)); printf("!Bienvenidos al juego: EL PRESO!\n\n"); Jugadores = cantJugadores(); puntuacionMax = elegirPuntuacion(); ingresarNombres(Jugadores); tirarDados(); system("pause"); return EXIT_SUCCESS; } // Funcion para tirar los dados // int tirarDados (void) { Dados = rand() % 11+2; printf("Arrojas los dados. Has sacado %d! \n", Dados); return Dados; } // Funcion para pasar de char a entero // int transEntero(char s) { return s - '0'; } // Funcion para validar la cantidad de jugadores al principio del juego// int cantJugadores () { do{ printf("Ingrese la cantidad de jugadores (%d a %d): ", MIN_JUGADORES, MAX_JUGADORES); Jugadores = transEntero(getche()); printf("\n"); }while (Jugadores < MIN_JUGADORES || Jugadores > MAX_JUGADORES); printf("Los participantes del juego seran %d.\n\n", Jugadores); return Jugadores; } // Funcion para elegir la maxima puntuacion al ppio del juego // int elegirPuntuacion () { char buffer [256]; do{ printf("Determine la cantidad de presos que se permiten dejar escapar (50 a 200): "); fgets (buffer, 256, stdin); puntuacionMax = atoi(buffer); } while(puntuacionMax < MIN_PUNTUACION || puntuacionMax > MAX_PUNTUACION); printf("No podran escaparse mas de %d presos. Si esto ocurre, el jugador pierde. A Jugar!!! \n\n", puntuacionMax); return puntuacionMax; } // Funcion para definir nombres de los jugadores // void ingresarNombres (int Jugadores) { int i, n; for(i = 0; i < Jugadores; i++){ printf("Ingrese el nombre del jugador %d: ", i+1); n = strlen(fgets(Nombres[i], MAX_NOMBRE, stdin))-1; if(Nombres[i][n] == '\n') Nombres[i][n] = 0; } for(i = 0; i < Jugadores; i++){ printf("El jugador %d se llama: %s\n", i+1, Nombres[i]); } } Cita:
Saludos. Última edición por escafandra fecha: 01-09-2012 a las 22:40:43. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Un pedacito de México | AzidRain | La Taberna | 3 | 22-01-2012 13:34:32 |
AYUDA por favor!!! | Melcv | Varios | 2 | 28-06-2006 21:19:35 |
Codigo de barras + QuickReport ... Help por favor!!!! | jdelphi | Impresión | 3 | 29-01-2005 07:58:00 |
Traducir un codigo de VB a Delphi ¡¡¡¡ Por favor !!!! | Betsa23 | Internet | 2 | 30-11-2004 16:29:35 |
Ayuda por favor | jtellof | Conexión con bases de datos | 4 | 08-09-2003 21:56:24 |
|