Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DickGumshoe

#291
No sé si te he entendido bien... ¿Lo que quieres es saber cómo reservar memoria dinámica en variables de tipo char?
#292
Inténtalo, y te ayudamos a partir de lo que pongas  :)
#293
¿Has probado con esto que dije?

Citar
A mí se me ocurre lo siguiente:

Podrías crear una cadena auxiliar, en la que copiaras el contenido de la cadena de caracteres que quieres contar el número de veces que aparece cada letra.

Con un bucle for anidado, vas comprobando el primer carácter con todos los demás de la cadena, y en caso de coincidir, aumentas el el contador de dicha letra en uno. Además, si coinciden, sustituyes en la cadena auxiliar dicho carácter por un espacio, para que cuando el bucle for llegue a dicho carácter no tengas que contar letras.

Espero haberme expresado bien...

Saludos.

Sino, te lo intento explicar mejor.

Saludos.
#294
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.
#295
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.
#296
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.
#297
EDITO 2:

Sí, al final creo que estaba bien lo que dije antes.

Daniyo, en strcat(), el segundo parámetro debe ser una cadena de caracteres (char*), no un solo carácter(char), ya que el prototipo es:

char *strcat(char*s1, const char *s2);

Para solucionarlo puedes obtener la longitud de la primera cadena con strlen() y meter el carácter que quieras en esa posición.

Saludos.
#298
Programación C/C++ / Ahorcado con ficheros
2 Julio 2012, 18:14 PM
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.
#299
Daniyo, unas aclaraciones. En C, cuando es sólo un carácter, no se puede pedir con gets, hay que utilizar scanf.

Además, para comparar dos caracteres, no se usa la función strcmp, sino como si compararas dos números.

También creo que se refiere el enunciado a que cuentes todos los caracteres de la cadena, no solo uno que le pida el usuario.

Te dejo el código de daniyo corregido, AlonsoQ. En caso de que sea contando todos los caracteres de la cadena, prueba a mirar lo que te dije en mi último mensaje, y si tienes alguna duda, pregunta y te intento ayudar a hacer el código.


#include <string.h>
#include <ctype.h>
#include <stdio.h>

int main(){
char cadena[256];
char letra;
int i;
printf("Introduce una cadena:\t");
gets(cadena);
int tamano=strlen(cadena);
for( i=0; i<tamano; i++){
 cadena[i]=tolower(cadena[i]);
}

printf("¿Que letra quiere contar?");
scanf("%c", &letra);
int count=0;
for(j=0; j<tamano; j++){
 if(cadena[j] == letra) count++;
}
printf("La letra aparece %d veces", count);
return 0;
}




Edito:

Por cierto, AlonsoQ, te recomiendo inicializar todas las variables justo después de "int main(){", y no esparcidas por todo el código. Ahora mismo no pasa nada, porque son códigos sencillos, pero mejor que te vayas acostumbrando para cuando trabajes con programas más complejos.
#300
A mí se me ocurre lo siguiente:

Podrías crear una cadena auxiliar, en la que copiaras el contenido de la cadena de caracteres que quieres contar el número de veces que aparece cada letra.

Con un bucle for anidado, vas comprobando el primer carácter con todos los demás de la cadena, y en caso de coincidir, aumentas el el contador de dicha letra en uno. Además, si coinciden, sustituyes en la cadena auxiliar dicho carácter por un espacio, para que cuando el bucle for llegue a dicho carácter no tengas que contar letras.

Espero haberme expresado bien...

Saludos.