Hola.
Estoy haciendo el juego del ahorcado.
He creado un fichero "prueba.dat", en el que meto palabras separadas por un espacio. Quiero obtener una palabra aleatoria de entre las que tengo.
Todavía no tengo la parte de obtener la palabra aleatoria, pero eso creo que sé hacerlo. El problema es que quiero meter las palabras antes en una matriz.
El programa compila, pero en un momento determinado (que tengo señalado en el programa) deja de funcionar y dice "Ahorcado.exe dejó de funcionar. Windows está buscando la solución al problema"...
#include<stdio.h>
#include<stdlib.h>
int NumeroEspaciosBlancos(FILE *fp);
void CogerPalabras(FILE *fp, int num);
int main(){
FILE *fp;
int num;
fp=fopen("prueba.dat", "r");
num=NumeroEspaciosBlancos(fp);
CogerPalabras(fp,num);
fclose(fp);
system("pause");
}
int NumeroEspaciosBlancos(FILE *fp){
char c;
int i=0 ;
while(feof(fp)==0){
c=fgetc(fp);
if(c==' ') i++;
}
rewind(fp);
return i;
}
void CogerPalabras(FILE *fp, int num){ //num es el número de espacios que tiene el fichero
char **M;
char c;
int i=0,j=0;
M=(char**)malloc((num+1)*sizeof(char*));
for(j=0;j<num+1;j++){
M[j]=(char*)malloc(20*sizeof(char));
j++;
}
i=0;
j=0;
while((feof(fp)==0) && (c=fgetc(fp))){ //EN ESTE BUCLE DEJA DE FUNCIONAR EL PROGRAMA
if(c!=' '){
M[i][j]=c;
j++;
}
if(c==' '){
i++;
j=0;
}
}
rewind(fp);
i=0;
j=0;
for(i=0;i<num;i++){
printf("\n");
for(j=0;j<20;j++){
printf("%c", M[i][j]);
}
}
}
Gracias.
Saludos.
No he mirado el codigo, pero donde dices que se para, en la condicion del while pones un operador de asignacion, y no creo que genere un valor booleano.
Saludos.
He hecho bastantes ejercicios en los que pongo esa condición:
while((feof(fp)==0) && (c=fgetc(fp)))
En la primera de las condiciones, comparo el resultado que me da la función feof() con 0, por lo que van dos iguales. En lo segundo, asigno un valor al carácter c (que se puede poner también dentro de un bucle while, pero aunque lo sacara y lo pusiera dentro de las llaves del while, no funciona de todas maneras), por lo que va un solo igual..
Gracias de todas formas.
Saludos.
Pues no se, yo sigo pensando que si le pones &&, este operador devuelve true si las dos(o mas) expresiones devuelven true, y como te he dicho no creo que la asignacion devuelva un valor booleano, entonces nunca entraria en el bucle. De todas formas, que lo diga alguien mas experto.
Saludos.
Pero el problema es que entra en el bucle y por alguna razón se para en algún momento. De todas formas, esa condición la he puesto en varios ejercicios y ha funcionado.
Saludos.
Ya lo he solucionado.
Era antes de entrar al bucle en el que se paraba el programa, al reservar memoria dinámica. Ahora he puesto:
M = (char**)malloc(num * sizeof(char*)); //Inicializamos filas
for(i = 0; i < num+1; i++) M[i] = (char*)malloc(c * sizeof(char)); //Inicializamos columnas
Saludos y gracias.
Citarno creo que la asignacion devuelva un valor booleano
Hola! acordate que en C cualquier valor distinto de 0 se toma como true por ende lo que se evalua con c=fgetc(fp) es el valor de c, osea el caracter que contiene
Saludos