Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Daniel Palma

Variável que não funciona

Recommended Posts

Boas noites.

Estou com um problema no seguinte código.

 

"Um dos erros que o programa tem é o de não inserir múltiplas
vezes a mesma palavra. Altere o menos possível o programa de forma a que
este passe a considerar o valor na variável n, definida na função "add_word",
e insira essa quantidade de vezes a palavra indicada."

 

Tenho este exercício para resolver e não estou a conseguir chegar lá.

Com a ajuda do debugger, já consegui perceber que a variável n perde o valor  aqui "n = n_ocurrences_for_given_word(w);".

 

Alguém me consegue inspirar a encontrar uma solução ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
typedef void (*pointerToFunction)();
typedef struct Element
{
    char* word;
    struct Element* next;
} Element;
void exit_program();
void init_list();
void check_password(int* passed, char* secret_pass);
void add_word();
void remove_word();
void show_words();
void show_secret();
int n_ocurrences_for_given_word(char *word);
struct Element *words_list = NULL;
int n_entries = 0;
char password_prompt[] = "password: ";
char wrong_password[] = "Wrong password!\n";
char word_prompt[] = "word: ";
char menu[] = "\n0 - exit 1 - add word; 2 - remove word; 3 - show words";
pointerToFunction functions[] = { exit_program, add_word, remove_word, show_words };
pointerToFunction s = show_secret;

int n;
int main()
{
    pointerToFunction* funs;
    int choice;
    int passed;
    char s[16];
    
    init_list();
    
    funs = functions;
    check_password(&passed, "mypass");
    
    if (passed)
    {
        for(;;)
        {
            write(1, menu, sizeof(menu) - sizeof(char));
            printf("\n");
            gets(s);
            choice = atoi(s);
            printf("choice = %d\n", choice);
            funs[choice]();
        }
    }
    else
    {
        write(1, wrong_password, sizeof(wrong_password) - sizeof(char));
    }
    return 0;
}

void exit_program()
{
    exit(0);
}
void init_list()
{
    words_list = malloc(sizeof(Element));
    words_list->word = "";
    words_list->next = NULL;
}
void check_password(int* passed, char* secret_pass)
{
    int check;
    char pass[32];
    
    write(1, password_prompt,  sizeof(password_prompt) - sizeof(char));
    scanf("%s", pass); getchar();
    
    check = (strcmp(pass, secret_pass) == 0);
    
    fprintf(stderr, "Repeat pass: ");
    scanf("%s", pass); getchar();
    *passed = check;
}
void show_secret()
{
    printf("Secret revealed!\n");
}
void add_word()
{
    int n;
    char w[8];
    Element *elem;
    
    printf("How many times?\n");
    
    scanf("%d", &n); getchar();
    
    write(1, word_prompt, sizeof(word_prompt)- sizeof(char));
    scanf("%s", w); getchar();
    printf("readed word: %s\n", w);
    
    elem = malloc(sizeof(Element));
    elem->word = malloc((strlen(w) + 1) * sizeof(char));
    strcpy(elem->word, w);
    elem->next = words_list->next;
    words_list->next = elem;
    n = n_ocurrences_for_given_word(w);
    
    printf("n:%d word:%s\n", n, w);
}
int n_ocurrences_for_given_word(char *word)
{
    Element *elem;
    int n;
    
    elem = words_list->next;
    n = 0;
    while(elem != NULL)
    {
        n += (strcmp(elem->word, word) == 0);
        elem = elem->next;
    }
    return n;
}
void remove_word()
{
    int n;
    char w[8];
    Element *e1, *e2;
    
    write(1, word_prompt, sizeof(word_prompt)- sizeof(char));
    scanf("%s", w); getchar();
    printf("readed word: %s\n", w);
    
    
    e1 = words_list;
    e2 = e1->next;
    
    n = 0;
    while(e2 != NULL)
    {
        if (strcmp(e2->word, w) == 0)
           { e1->next = e2->next; n += (*(e2->word+1) == 044); }
        else
           e1 = e1->next;
        e2 = e2->next;
        if (n == 3) s();
    }
}

void show_words()
{
    printf("\nwords:\n");
    Element *e = words_list->next;
    while(e != NULL)
    {
        printf("%s ", e->word);
        e = e->next;
    }
    printf("\n");
    fflush(stdout);
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×