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)
| | |-+  [C] Cadena de caracteres "sucia"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Cadena de caracteres "sucia"  (Leído 3,864 veces)
Rockmore

Desconectado Desconectado

Mensajes: 18



Ver Perfil
[C] Cadena de caracteres "sucia"
« en: 6 Noviembre 2010, 20:29 pm »

Muy buenas de nuevo. Aquí vengo con un nuevo programa, esta vez 100% resuelto por mí. Explico de qué va:

Es un juego en el que 4 jugadores deben recorrer un tablero de 30 casillas con tiradas aleatorias de 0 a 6 casillas por turno, con posibilidad de empate. El programa está hecho de modo que el tablero sea una cadena de 60 caracteres, \0 incluido, que alterna puntos y espacios, empezando por punto en la posición 0 y terminando en espacio en la posición 59 (a pesar de que efectivamente sustituya a \0 ).

Bien, el caso es que la primera vez que se ejecuta el programa, el tablero tiene 30 puntos con espacios entre ellos, y el movimiento de las fichas es perfecto, ya que sustituyen a los puntos como se espera. Todo funciona bien. Sin embargo, al repetir la partida, al final del tablero me aparecen simbolos extraños, en este caso, una 's', a la que le sigue un ';' tras la primera actualización hasta el final del bucle.

Alguno me dirá, "no pongas un espacio en la posición del \0". Si no lo pongo, en lugar de la 's', me aparece una '#'.

Otro me contestará, "aumenta el tamaño de la cadena una posición más". Si lo hago así, me aparece de nuevo la '#' pero más a la derecha.

Por tanto, deduzco que de algún modo debo limpiar mejor la cadena del tablero para que reinicie sin fallos. ¿Alguna idea? Aquí dejo el código:

Código:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
//Librerías

/*Carrera de dados, por Rockmore*/

int main(void){
    char pista[60],res;
    int i,a,b,c,d,dado1,dado2,dado3,dado4;
    //Declaración de variables

    srand(time(0));//Reinicio de semilla

    do{
        for(i=0;i<=58;i+=2){
            pista[i]='.';
        }
        for(i=1;i<=59;i+=2){
            pista[i]=' ';
        }
        i=0;
        a=0;
        b=0;
        c=0;
        d=0;//Reinicio del tablero

        do{
            system("cls");
            printf("----------------");
            printf("\nCarrera de dados");
            printf("\n----------------\n\n");
            printf("%s\n",pista);
            printf("\n------------------------------------");
            printf("\nPulsa una tecla para tirar los dados");
            printf("\n------------------------------------");
            getche();//Muestra de tablero a mitad de carrera

            dado1=rand()%7;
            dado2=rand()%7;
            dado3=rand()%7;
            dado4=rand()%7;//Tiradas de dados

            printf("\nJugador 1 (x): %d",dado1);
            printf("\nJugador 2 (o): %d",dado2);
            printf("\nJugador 3 (*): %d",dado3);
            printf("\nJugador 4 (&): %d",dado4);
            printf("\n\n\n------------------------------");
            printf("\nPulsa una tecla para continuar");
            printf("\n------------------------------");//Muestra de tiradas

            a=a+dado1*2;
            b=b+dado2*2;
            c=c+dado3*2;
            d=d+dado4*2;//Reajuste para movimiento

            if(a>58){
                a=58;
            }if(b>58){
                b=58;
            }if(c>58){
                c=58;
            }if(d>58){
                d=58;
            }//Reajuste para meta sobrepasada

            for(i=0;i<=58;i+=2){
                pista[i]='.';
            }
            for(i=1;i<=57;i+=2){
                pista[i]=' ';
            }//Limpieza de tirada anterior

            pista[a]='x';
            pista[b]='o';
            pista[c]='*';
            pista[d]='&';//Actualización de tablero
            getche();
        }while(pista[58]=='.');
        system("cls");
        printf("----------------");
        printf("\nCarrera de dados");
        printf("\n----------------\n\n");
        printf("%s\n\n\n",pista);//Condición final del tablero

        if(a==58){
            printf("El jugador 1 ha llegado a la meta!\n");
        }if(b==58){
            printf("El jugador 2 ha llegado a la meta!\n");
        }if(c==58){
            printf("El jugador 3 ha llegado a la meta!\n");
        }if(d==58){
            printf("El jugador 4 ha llegado a la meta!\n");
        }//Anuncio del ganador

        if(a==b||a==c||a==d||b==c||b==d||c==d){
            printf("EMPATE");
        }//Condición de empate

        printf("\nVolver a jugar (s/n)?");
        scanf("%s",&res);//Pregunta de repetición

    }while(res=='s');//Condición de repetición
}


En línea

madpitbull_99
Colaborador
***
Desconectado Desconectado

Mensajes: 1.911



Ver Perfil WWW
Re: [C] Cadena de caracteres "sucia"
« Respuesta #1 en: 6 Noviembre 2010, 21:30 pm »

No he mirado tu código pero yo limpio las cadenas usando un for y asignando un como valor un espacio a cada cadena.

Ejemplo:

Código
  1. for (int i; i <= longitud_cadena; i++) {
  2.     cadena[i] = "";
  3. }
  4.  
Mas o menos así lo hago yo .


En línea



«Si quieres la paz prepárate para la guerra» Flavius Vegetius

[Taller]Instalación/Configuración y Teoría de Servicios en Red
Rockmore

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: [C] Cadena de caracteres "sucia"
« Respuesta #2 en: 6 Noviembre 2010, 22:52 pm »

Es un buen apaño para evitar tener que medir "cada dos casillas", sin embargo, me sigue saliendo sucia la cadena al repetir el juego, en la primera iteración no tengo problemas.

No obstante, tras hacer algunas pruebas he observado que la 's' que sale es la que recoge de la última pregunta de volver a jugar, ya que si cambio la peticion por una 'f', por ejemplo, tengo el mismo fallo gráfico, pero con la 'f' en lugar de con la 's'. Deduzco de ahí que se añade ese caracter a la cadena 'pista' y es entonces cuando provoca que se descoloque y la aparición del símbolo extra. He probado con un fflush tanto al principio del bucle como tras recoger la respuesta, pero sigue apareciendo.

EDIT: Problema resuelto. Basta con sustituir el último caracter de la cadena por un '\0' en cada limpieza. Gracias de todas formas.
« Última modificación: 6 Noviembre 2010, 23:21 pm por Rockmore » En línea

kimary

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: [C] Cadena de caracteres "sucia"
« Respuesta #3 en: 8 Noviembre 2010, 02:45 am »

Hola,

He leido tu codigo un poco rapido y tal asi k igual mi respuesta no te ayuda mucho pero ...

As probado a poner el "\0" al final del tablero?? al hacer el printf("%s",pista), el printf imprime por pantalla los caracteres hasta que encuentra el "\0", y si tu cadena no lo tiene, aunk llegue al final, la funcion no lo sabe y sigue sacando cosas por pantalla.

PD: El /0 tienes que ponerlo tu con pista[59] = '\0'


EDIT: JAJAJAJAJA he visto que ya lo habias resuelto despues de potear. no se pq no he visto esa respuesta XD
« Última modificación: 8 Noviembre 2010, 02:46 am por kimary » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
"¿Está sucia mi pantalla?": desenmascaran un truco fraudulento de publicidad ...
Noticias
wolfbcn 1 1,813 Último mensaje 4 Febrero 2018, 18:04 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines