A friend of mine is trying to write this simple C program and he's having a problem with the fgets() function. He's also brazilian but he doesn't speak english, that's why I'm asking for him. Take a look at his code, please:
At the prompt, if you type something with more than four characters, look what happens:Code:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void flush_newline(char *); int process_choice(char *); int valid_menu_choice(char *); int main() { char line[5]; do{ printf("[1] Cadastrar cliente\n"); printf("[2] Visualizar ficha\n"); printf("[3] Sair\n\n"); printf("> "); fgets(line, sizeof line, stdin); flush_newline(line); }while(process_choice(line) != 3); return 0; } /*____________________________________________________________________ | flush_newline(): retira o \n do final da string se o mesmo existir. | | | | Parâmetros: a string a ser testada. | |_____________________________________________________________________|*/ void flush_newline(char *line) { char *pointer; if((pointer = strchr(line, '\n')) != NULL) *pointer = '\0'; } /*______________________________________________________________________________________________ | process_choice(): Valida e, se tudo estiver certo, processa a opção escolhida pelo usuário | | no menu principal. | | | | Parâmetros: | | line: texto digitado pelo usuário no prompt do menu principal. | | | | Retorna: | | Se o input do usuário não for uma opção válida, a função retorna o número 0. Dessa forma, | | o menu e o prompt vão ser mostrados outra vez na tela por causa do loop na função main(). | |_______________________________________________________________________________________________|*/ int process_choice(char *line) { int menu_choice; if((menu_choice = valid_menu_choice(line)) == 0) return 0; if(menu_choice == 3) exit(1); } /*_________________________________________________________________________________________________ | valid_menu_choice(): Valida o input do usuário de acordo com as opções do menu principal. | | | | Parâmetros: | | line: texto digitado pelo usuário no prompt do menu principal. | | | | Retorna: | | Se o input do usuário não for válido, a função retorna o número 0, o que vai causar a função | | process_choice() retornar 0 também. O menu e o prompt vão ser mostrados outra vez na tela. | | | | Se o input for válido, ele será convertido para int e retornado. | |__________________________________________________________________________________________________|*/ int valid_menu_choice(char *line) { size_t i; int menu_choice; if(line[0] == '\0'){ printf("Comando desconhecido.\n\n"); return 0; } for(i = 0; i < strlen(line); i++){ if(!isdigit(line[i])){ printf("Comando desconhecido.\n\n"); return 0; } } sscanf(line, "%d", &menu_choice); return menu_choice; }
Wasn't fgets() supposed to take care of that? I couldn't help him but I hope one of you can. Thanks in advance.Code:[1] Cadastrar cliente [2] Visualizar ficha [3] Sair > qqqqqqqqqqqqqqq Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair > Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair > Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair > Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair > Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair > Comando desconhecido. [1] Cadastrar cliente [2] Visualizar ficha [3] Sair >



LinkBack URL
About LinkBacks


