Problem with gets and fgets

3

I'm having problems with the gets and fgets function ...

Always when I use them, the program skips the input, ie the user can not type the string, but only works with scanf , but I need to use the gets or fgets. I have already used the getchar() function; every time I use it until it lets me type, but it just repeats, saying to record another one over and over and over again ...

Below is the code:

int main()
{

    char s1[20];
    char s2[20];
    int escolha = 1;

    printf("*****************************\n");
    printf("*Menu de opções para strings*\n");
    printf("*****************************\n\n");
    printf("Primeiro informe seu nome por favor: ");
    gets(s1);

    do
    {
        printf("\n(1) Quer saber o tamanho de seu nome?\n");
        printf("(2) Que tal comparar seu nome com outro nome?\n");
        printf("(3) Quer unir seu nome com outro nome?\n");
        printf("(4) O que acha de seu nome invertido?\n");
        printf("(5) Quer saber quantas vezes a mesma letra aparece em seu nome?\n");
        scanf("%d", &escolha);
        system("cls");

        switch(escolha)
        {

        case 1:
            printf("A quantidade de caracters de seu nome é: %d", strlen(s1));
            break;

        case 2:
            printf("Digite um novo nome para comparar: ");
            fgets(s2, 20, stdin);
            break;

        default:
            printf("Opção inválida");
        }

    } while(escolha);
    return 0;
}
    
asked by anonymous 29.11.2017 / 03:48

2 answers

1

I suggest that you always use fgets , as this is something you are already using, and ensures that your program is never susceptible to Buffer overflows .

Even when you have to read an integer as in opcao , you can still read the content as a string to a temporary buffer of a size you define, and interpret your integer either with sscanf or even atoi :

char buff[20];
fgets(buff, 20, stdin);
sscanf(buff, "%d", &escolha);

Note that sscanf functions as scanf but starting with a string instead of the input stream.

Using fgets and sscanf , your program looks like this:

char s1[20];
char s2[20];
char buff[20]; //buffer de leituras
int escolha = 1;

printf("*****************************\n");
printf("*Menu de opções para strings*\n");
printf("*****************************\n\n");
printf("Primeiro informe seu nome por favor: ");
fgets(s1,20,stdin);
s1[strlen(s1)-1] = '
void lerString(char *stringLida){
    fgets(stringLida, 20, stdin);
    stringLida[strlen(stringLida)-1] = '
lerString(s1);
'; }
'; //remover o \n que ficou da leitura com fgets do { printf("\n(1) Quer saber o tamanho de seu nome?\n"); printf("(2) Que tal comparar seu nome com outro nome?\n"); printf("(3) Quer unir seu nome com outro nome?\n"); printf("(4) O que acha de seu nome invertido?\n"); printf("(5) Quer saber quantas vezes a mesma letra aparece em seu nome?\n"); fgets(buff, 20, stdin); //agora fgets sscanf(buff, "%d", &escolha); //leitura do numero com sscanf system("cls"); switch(escolha) { case 1: printf("A quantidade de caracters de seu nome é: %d", strlen(s1)); break; case 2: printf("Digite um novo nome para comparar: "); fgets(s2, 20, stdin); s2[strlen(s2)-1] = '
char buff[20];
fgets(buff, 20, stdin);
sscanf(buff, "%d", &escolha);
'; //remover o \n também break; default: printf("Opção inválida"); } } while(escolha);

You may want to abstract the read logic for a function in order to simplify its various uses:

char s1[20];
char s2[20];
char buff[20]; //buffer de leituras
int escolha = 1;

printf("*****************************\n");
printf("*Menu de opções para strings*\n");
printf("*****************************\n\n");
printf("Primeiro informe seu nome por favor: ");
fgets(s1,20,stdin);
s1[strlen(s1)-1] = '
void lerString(char *stringLida){
    fgets(stringLida, 20, stdin);
    stringLida[strlen(stringLida)-1] = '
lerString(s1);
'; }
'; //remover o \n que ficou da leitura com fgets do { printf("\n(1) Quer saber o tamanho de seu nome?\n"); printf("(2) Que tal comparar seu nome com outro nome?\n"); printf("(3) Quer unir seu nome com outro nome?\n"); printf("(4) O que acha de seu nome invertido?\n"); printf("(5) Quer saber quantas vezes a mesma letra aparece em seu nome?\n"); fgets(buff, 20, stdin); //agora fgets sscanf(buff, "%d", &escolha); //leitura do numero com sscanf system("cls"); switch(escolha) { case 1: printf("A quantidade de caracters de seu nome é: %d", strlen(s1)); break; case 2: printf("Digite um novo nome para comparar: "); fgets(s2, 20, stdin); s2[strlen(s2)-1] = '%pre%'; //remover o \n também break; default: printf("Opção inválida"); } } while(escolha);

What would you use like this:

%pre%

See the code working on Ideone

    
29.11.2017 / 04:38
0

Would not it be the case of using fflush (stdin) after the following lines?

gets(s1);
fflush(stdin);

scanf("%d", & escolha);
fflush(stdin);

fgets(s2, 20, stdin);
fflush(stdin);
    
29.11.2017 / 04:32