ejercicio 3

ejercicio 3

de María Clara Rodríguez Chavarría -
Número de respuestas: 5

Buenas noches, primero quisiera disculparme porque sé que ya terminamos este tema, pero quería saber si alguien podría ayudarme. Tengo esta implementación de la función Ocurrencias y me da Segmentation fault luego de ingresar la frase; no logro encontrar el problema, quizás sea algo muy obvio pero no me doy cuenta. Alguien sabe qué puede ser? Desde ya muchas gracias a todos.

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

struct atope{
    char frase[100];
    int tope; //tope es la cantidad de lugares, no el ultimo indice
};

void cargar(atope arr){
    char letra;
    scanf("%c",&letra);
    int i=0;
    while (letra!='.'){
        arr.frase[i]=letra;
        scanf("%c",&letra);
        i++;
    }
    arr.tope=i;
}

bool iguales(char signo,char letra,char LETRA){
    return (signo==letra||signo==LETRA);
}

int Ocurrencias(char frase[100],int n,char l){
    int res=0;
    for (int i=0;i<n;i++){
        if (iguales(frase[i],tolower(l),toupper(l))){
            res++;
        }
    }
    return res;
}

main(){
    printf("Ingrese una frase, fin con punto: ");
    atope arr;
    cargar(arr);
    char l;
    printf("Ingrese una letra: ");
    scanf("%c",&l);
    printf("La letra aparece %d veces\n",Ocurrencias(arr.frase,arr.tope,l));
    return 0;
}

En respuesta a María Clara Rodríguez Chavarría

Re: ejercicio 3

de Marcos Alexis Revetria Derquin -
Creo que es porque para que "cargar" funcione bien, el parametro debe ser pasado como atope &arr. Si no, el arreglo y el tope quedan cargados con datos basura. Y al llamar Ocurrencias, el tope queda con un valor que se sale de rango.
En respuesta a Marcos Alexis Revetria Derquin

Re: ejercicio 3

de María Clara Rodríguez Chavarría -
Muchas gracias! Eso ayudó y ahora ejecuta, aunque no cumple con lo esperado, debo tener más errores. Sabes por qué es que tengo que pasarlo como (atope &arr), si arr es un struct? No termino de comprender eso. Pensé que el & se ponía solo para pasar como variable estática un puntero del scanf.
En respuesta a María Clara Rodríguez Chavarría

Re: ejercicio 3

de Marcos Alexis Revetria Derquin -
Fíjate en la lineal scanf("%c",&l);, cámbiala por scanf(" %c",&l);, con un espacio antes del %c. Porque si no, cuando ejecutas el programa y das enter, ese enter cuenta como un carácter que queda pendiente por ser leído para el siguiente scanf, y se jode todo. XD

Si entendí bien, el & sirve para indicar un lugar de la memoria que esta reservada para almacenar los datos de la variable. Por eso si querés modificar lo que vale arr, tenés que apuntar con & para que la función modifique lo que está guardado en ese lugar de la memoria. Vendría a ser lo mismo que en Pascal cuando se ponía var adelante para indicar que un parámetro se pasa por referencia. Creo que es así como funciona. XD
En respuesta a Marcos Alexis Revetria Derquin

Re: ejercicio 3

de María Clara Rodríguez Chavarría -
Gracias!! Estoy entendiendo creo, eso ayudó más. Ahora lo único que sale mal es que precisa leer más de un Char que no sean enter, y solo guarda el primero. Son mil cosas XD gracias por tanta ayuda, logré entender mejor lo del &. Saludos

el problema que tengo ahora es que me hace esto; no quiero seguir molestando, no te sientas obligado a seguir respondiendo xdd 
codigo
En respuesta a María Clara Rodríguez Chavarría

Re: ejercicio 3

de Federico Andrade -
Hola María,
Por lo que mostrás en la imagen, parecería estar funcionando acorde a lo que pide el ejercicio. Incluso si te ingresan varias letras (aunque no te tendrías que preocupar por eso, se espera que el usuario colabore y haga lo que se le pide), se queda solo con la primera. ¿podrías describir en forma más precisas qué es lo que querés lograr que no te está funcionando?

Otros comentarios de lo primero que posteaste
1- Al main le falta el retorno (int).
int main () ....
2- Sobre la forma de leer la frase, te conviene leerla como un string y no caracter por caracter. Para leerla como un string tenés que hacer algo así
char * frase = new char[100];
scanf ("%[^.]", frase);
Luego podes usar strlen (frase) para saber el largo del string leído y a partir de ahí recorrerlo caracter por caracter comparándolo con el que estás buscando.
3- El problema inicial que estabas teniendo no es por lo que comentaba Marcos. Lo que comenta Marcos es correcto en el sentido de que si no lo pasas utilizando & el struct se pasa por copia, y lo que modificas adentrodo de cargar es una copia de arr, no es el arr que creaste en el main. Por lo qué una vez que termine la función cargar, los cambios sobre arr no tienen efecto. Pero probé tu código y el problema está adentro de cargar, por lo que el problema no es al llamar a ocurrencias aparentemente.
4- No te preocupes por mandar dudas sobre temas aunque ya hayan pasado. Hacelo sin problema porque es mucho mejor que hagas y resuelvas los ejercicios aunque sea tarde, que quedarte con dudas o no hacerlo.

Saludos


Saludos.