Ir ao conteúdo
  • Cadastre-se

Variável que não funciona


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...