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);
}