O comando fflush(stdin); não está funcionando

Home Fóruns Linguagem C O comando fflush(stdin); não está funcionando

Visualizando 26 respostas da discussão
  • Autor
    Posts
    • #60620

      Olá, estou com dificuldade na aula 7, módulo 1.
      Mesmo digitando exatamente o que o Prof. Guanabara digita no vídeo, o comando não zera o buffer do teclado, estou usando Ubuntu 20.04 e Codeblocks 20.03.

    • #60621

      O comando gets(valor); também não funciona.

    • #60629

      Poderia me mandar seu código?

      • #60632

        #include <stdio.h>
        #include <locale.h>
        void main() {
        setlocale(LC_ALL, “Portuguese”);
        char r;
        char s;
        printf(“Digite uma letra: “);
        fflush(stdin);
        scanf(“%c”, &r);
        printf(“Digite outra letra: “);
        fflush(stdin);
        scanf(“%c”, &s);
        printf(“Você digitou as letras \”%c\” e \”%c\””, r, s);
        }

    • #60630

      #include <stdio.h>
      #include <locale.h>
      void main() {
      setlocale(LC_ALL, “Portuguese”);
      char = r;
      char = s;
      printf(“Digite uma letra: “);
      fflush(stdin);
      scanf(“%c”, &r);
      printf(“Digite outra letra: “);
      fflush(stdin);
      scanf(“%c”, &s);
      printf(“Você digitou as letras \”%c\” e \”%c\””, r, s);
      }

    • #60631

      Desculpa, digitei errado, eu digitei pelo celular.

    • #60633

      #include <stdio.h>
      #include <locale.h>
      void main() {
      setlocale(LC_ALL, “Portuguese”);
      char nome[30];
      char ende[50];
      printf(“Digite seu nome: “);
      gets(nome);
      printf(“Digite o endereço: “);
      gets(ende);
      printf(“Você digitou \”%s\” e ele mora em \”%s\””, nome, ende);
      }

      • #85315
        RICARDO MELO
        Participante

        Olá Claudio resolvi o meu exercício usando a funçao strlen, como no código abaixo:

        #include <stdio.h>
        #include <stdlib.h>
        #include <locale.h>
        #include <string.h>
        int main(void)
        {
        setlocale(LC_ALL, “Portuguese”);
        char nome1[20], nome2[20], nome3[20];
        char sexo1, sexo2, sexo3;
        float nota1, nota2, nota3;
        int len;

        printf(“Cadastrando primeira a pessoa:\n——————————\nNome: “);
        fgets(nome1, 20, stdin);
        len = strlen(nome1);
        if (nome1[len – 1] == ‘\n’)
        nome1[len – 1] = ‘\0’;
        printf(“\nSexo:(M/F): “);
        scanf(“%c”, &sexo1);
        fflush(stdin);
        printf(“\nNota: “);
        scanf(“%f”, &nota1);
        fflush(stdin);

        printf(“\nCadastrando a segunda pessoa: \n——————————\nNome: “);
        fgets(nome2, 20, stdin);
        len = strlen(nome2);
        if (nome2[len – 1] == ‘\n’)
        nome2[len – 1] = ‘\0’;
        printf(“\nSexo:(M/F): “);
        scanf(“%c”, &sexo2);
        fflush(stdin);
        printf(“\nNota: “);
        scanf(“%f”, &nota2);
        fflush(stdin);

        printf(“\nCadastrando a terceira pessoa: \n——————————\nNome: “);
        fgets(nome3, 20, stdin);
        len = strlen(nome3);
        if (nome3[len – 1] == ‘\n’)
        nome3[len – 1] = ‘\0’;
        printf(“\nSexo: “);
        scanf(“%c”, &sexo3);
        fflush(stdin);
        printf(“\nNota: “);
        scanf(“%f”, &nota3);
        fflush(stdin);

        printf(“\n\nListagem completa\n——————————\nNome\t\tSexo\tNota\n”);
        printf(“\n%s\t\t%c\t%.1f\n”, nome1, sexo1, nota1);
        printf(“\n%s\t\t%c\t%.1f\n”, nome2, sexo2, nota2);
        printf(“\n%s\t\t%c\t%.1f\n”, nome3, sexo3, nota3);

        }

      • #85361
        Tutora Vera
        Mestre

        Ricardo, agradecemos contribuir com sua experiência. Parabéns e bons Estudos. 🖖

    • #60634

      O comando gets também não está funcionando

    • #60681

      Uma pergunta, vc está tentando fazer os exercícios em algum editor pra celular ou em um computador mesmo?

    • #60697

      Olha, faz tempo q eu não uso o ubuntu, mas vc poderia tentar atualizar ou quem sabe fazer um downgrade no compilador.

    • #60703
      thiago perez novas
      Participante

      fflush pra mim que uso ubuntu 18.04 também não funciona. gets() funciona mas da um warning perguntando “did you mean fgets?” estou um pouco confuso.

    • #60704

      Mudei pra Linux mint 20.1 de agora o #include <stdio.h> não funciona mais.

    • #60739
      thiago perez novas
      Participante

      As vezes também uso a função setbuf(stdin, NULL); Mas no geral fico um pouco confuso com tantas opções que algumas vezes funcionam e outras não.

    • #60824
      Tutora Mayla
      Mestre

      Claudio, o fflush(stdin) não é padronizado no C, cada compilador em cada SO vai ter um comportamento diferente, é possível substituir ele em problemas desse tipo utilizando um getchar() após a leitura de cada caracter. O getchar() vai ler esse caractere do enter esvaziando o buffer. Chamo atenção para o fato de que só ira funcionar quando só houver um caractere no buffer, pois o getchar() só pega um caracter.
      Quanto ao gets(), substitua o uso dele pelo uso do fgets(variavel, tamanhoMax, stdin). O fgets() fará a leitura de uma sequência de caracteres até que seja dado enter, ou seja, até encontrar um \n. O tamanho máximo especificado fará com que a leitura seja encerrada mesmo que não haja o enter, o limite será sempre um a menos que o tamanho informado por conta do caractere que informa o fim da string.
      Reinstale o compilador no seu Linux Mint e veja se assim funciona, senão nos informe.
      Espero ter ajudado, se a dúvida persistir ou para quaisquer outras dúvidas basta entrar em contato.

    • #60902
      Stephen Dias Barreto
      Participante

      Para limpar o buffer em Linux, use: __fpurge(stdin)

    • #61843

      Meus códigos

      #include <stdio.h>
      void main(){
      char r;
      char s;
      printf(“Digite uma letra: “);
      fflush(stdin); // faz a limpeza do buffer antes da entrada de dados
      scanf(“%c”, &r);
      printf(“Digite uma letra: “);
      fflush(stdin);
      scanf(“%c”,&s);
      printf(“Você digitou as letras \”%c\” e \”%c\””, r, s);
      }

      #include <stdio.h>
      void main(){
      char r;
      char s;
      printf(“Digite uma letra: “);
      fflush(stdin);
      r = getchar();
      printf(“Digite uma letra: “);
      fflush(stdin);
      r = getchar();
      printf(“Você digitou as letras \”%c\” e \”%c\””, r, s);
      }

      No meu não funcionou nenhum dos dois métodos abordados na aula. Só funciona se eu fizer ” %c”.

    • #61844

      ” %c” (com o espaço antes do %)

    • #62838

      Boa noite, também estou com dificuldade usando Linux 20.04, nenhum dos comandos funciona corretamente, todos tem bugs, já a maneira que a tutora Mayla disponibilizou não consegui compreender corretamente se puder fazer um exemplo de como utilizar o fgets() agradeço!

      • #63141
        Tutora Mayla
        Mestre

        Rafael, poderia nos enviar um exemplo desses bugs que acontecem colando aqui as mensagens de erro que deram?
        Sobre a função fgets(), digamos que eu queira ler o nome completo que foi digitado no terminal, ou seja, quero ler uma linha inteira de uma única vez. Para isto, preciso ter uma variável do tipo char[] que vai armazenar este texto digitado. Supondo que ele não será maior do que 80 caracteres, vamos ver o uso da função em um exemplo:

        
        char nomeCompleto[80];
        printf("Digite o seu nome completo: ");
        fgets(nomeCompleto, 80, stdin);
        printf("Olá, %s\n", nomeCompleto);
        

        Olhando para a função fgets, percebemos que precisamos passar 3 parâmetros:

        1. Variável onde será armazenada o texto;
        2. Tamanho máximo do texto a ser lido, incluindo o caracter de controle '\0' que é inserido ao final da string. Isto é, no exemplo serão lidos no máximo 79 caracteres;
        3. Local de leitura do texto, nesse caso a stdin que é usada para realizar a leitura do teclado.

        Espero ter ajudado, quaisquer outras dúvidas basta entrar em contato.

    • #63223

      O BUG que eu quis dizer é que todos os comando da aula não funciona ele pula pra linha seguinte,
      Porém o exemplo que você deu funciona mas faz uma quebra de linha automática no printf após exibir o nome!

      Exemplo:

      printf("Qual seu nome? ");
      fgets(nome, 30, stdin);
      printf("Prazer em conhecê-lo %s seja bem vindo!", nome);

      O resultado fica assim na tela!

      Qual seu nome? Rafael
      Prazer em conhecê-lo Rafael
      seja bem vindo // o seja bem vindo pula para linha de baixo após a variável nome ser exibida!

    • #63444
      Tutora Mayla
      Mestre

      Rafael, esta situação acontece pois o fgets quando lê uma string que seja menor que o tamanho informado, deixa um caracter '\n' ao final dessa string, fazendo com que quando escrevemos essa string com um printf tenha essa quebra de linha. Este comportamento não ocorre com a função gets porém esta função sofre com alguns problemas de segurança.
      Para continuar utilizando a fgets e resolver este problema, precisamos saber em qual posição da cadeia se encontra este caracter '\n' e substituí-lo pelo marcador de fim de string '\0'. Uma forma é utilizando a função strcspn da biblioteca string.h que encontra a primeira ocorrência de um caracter dentro de uma cadeia, conforme o exemplo a seguir:

      printf("Qual seu nome? ");
      fgets(nome, 30, stdin);
      int quebra = strcspn(nome, "\n");
      nome[quebra] = '\0';
      printf("Prazer em conhecê-lo %s seja bem vindo!", nome);

      Para utilizar esta função é necessário incluir a biblioteca string.h.

      Espero ter ajudado, caso a dúvida persista basta entrar em contato.

    • #63455

      Vamos la, acredito que os bugs estão presente na versão 9 do GCC pois testei no Linux, no Windows e o Comando fflush não funciona!
      tentei por diversas vezes usar fflush junto com getchar() e toda vez no EX004 que tem q cadastrar mais de uma cadeira o problema sempre ocorre, vou postar aqui meu código, mas ja fiz os teste tanto com fgets, com scanf e todos eles pula alguma parte na hora de colocar os dados, não sendo possivel realizar o exercicio com clareza!

      #include <stdio.h>
      #include <locale.h>
      #include <string.h>
      
      void main() {
          setlocale(LC_ALL, "Portuguese_Brasil");
      
          char nome1[30], nome2[30], nome3[30];
          char sexo1, sexo2, sexo3;
          float nota1, nota2, nota3;
      
          printf("<<<<<------ EX004 LISTAGEM ------>>>>>>\n");
      
          printf("Cadastrando a primeira pessoa.\n");
          printf("-------------------------------\n");
          printf("NOME: ");
          fflush(stdin);
          fgets(nome1, 30, stdin);
          printf("SEXO [M/F]: ");
          fflush(stdin);
          getchar();
          sexo1 = getchar();
          printf("NOTA: ");
          fflush(stdin);
          scanf("%f", &nota1);
      
          printf("Cadastrando a segunda pessoa.\n");
          printf("------------------------------\n");
          printf("NOME: ");
          fflush(stdin);
          getchar();
          scanf("%s", nome2); 
          printf("SEXO [M/F]: ");
          fflush(stdin);
          getchar();
          sexo2 = getchar();
          printf("NOTA: ");
          fflush(stdin);
          scanf("%f", &nota2);
      
          printf("Cadastrando a terceira pessoa.\n");
          printf("-------------------------------\n");
          printf("NOME: ");
          fflush(stdin);
          getchar();
          scanf("%s", nome3);
          printf("SEXO [M/F]: ");
          fflush(stdin);
          getchar();
          sexo3 = getchar();
          printf("NOTA: ");
          fflush(stdin);
          scanf("%f", &nota3);
      
          int quebra1 = strcspn(nome1, "\n");
          nome1[quebra1] = '\0';
          int quebra2 = strcspn(nome2, "\n");
          nome2[quebra2] = '\0';
          int quebra3 = strcspn(nome3, "\n");
          nome3[quebra3] = '\0';
      
          printf("\nListagem Completa.");
          printf("\n------------------------------------");
          printf("\nNOME\t\tSEXO\tNOTA");
          printf("\n%s\t\t%c\t%.1f", nome1, sexo1, nota1);
          printf("\n%s\t\t%c\t%.1f", nome2, sexo2, nota2);
          printf("\n%s\t\t%c\t%.1f", nome3, sexo3, nota3);
          printf("\n------------------------------------");
          printf("\n\n");
      }

      RESULTADO!

      <<<<<—— EX004 LISTAGEM ——>>>>>>
      Cadastrando a primeira pessoa.
      ——————————-
      NOME: Rafael Santos
      SEXO [M/F]: M
      NOTA: 8
      Cadastrando a segunda pessoa.
      ——————————
      NOME: Eduarda Santos
      SEXO [M/F]: NOTA: Cadastrando a terceira pessoa.
      ——————————-
      NOME: SEXO [M/F]: M
      NOTA: 8

      Listagem Completa.
      ————————————
      NOME SEXO NOTA
      Rafael Santos
      8.0
      Eduarda S 0.0
      ntos M 8.0
      ————————————

    • #63456

      Só retificando o código esqueci de mudar o scanf dos Nome para fgets, mas testei aqui e BUG ocorro da mesma maneira não entrando os dados corretamente!

      <<<<<—— EX004 LISTAGEM ——>>>>>>
      Cadastrando a primeira pessoa.
      ——————————-
      NOME: Rafael Santos
      SEXO [M/F]: M
      NOTA: 8
      Cadastrando a segunda pessoa.
      ——————————
      NOME: SEXO [M/F]: F
      NOTA: 10
      Cadastrando a terceira pessoa.
      ——————————-
      NOME: SEXO [M/F]: M
      NOTA: 6

      Listagem Completa.
      ————————————
      NOME SEXO NOTA
      Rafael Santos
      8.0

      10.0

      6.0
      ————————————

    • #63485

      Boa Tarde Pessoal, depois de muitas tentativas descobri o BUG do fflush().

      O BUG ocorre quando usamos no código a quebra de linha na linha anterior a entrada de dados, depois que mudei a ordem dos \n o programa funcionou corretamente!

      segue abaixo o código corrigido!

      #include <stdio.h>
      #include <locale.h>
      #include <string.h>
      
      void main() {
          setlocale(LC_ALL, "Portuguese");
          
          char nome1[20], nome2[20], nome3[20], sexo1, sexo2, sexo3;
          float nota1, nota2, nota3;
      
          printf("<<< EX004 - Listagem Pessoas >>>\n");
          printf("\nCadastrar primeira pessoa: \n");
          fflush(stdin);
          printf("NOME: ");
          fgets(nome1, 30, stdin);
          printf("SEXO [M/F]: ");
          fflush(stdin);
          sexo1 = getchar();
          printf("NOTA: ");
          scanf("%f", &nota1);
      
          printf("Cadastrar segunda pessoa: \n");
          fflush(stdin);
          printf("NOME: ");
          fgets(nome2, 30, stdin);
          printf("SEXO [M/F] ");
          sexo2 = getchar();
          printf("NOTA: ");
          scanf("%f", &nota2);
      
          printf("Cadastrar terceira pessoa: \n");
          fflush(stdin);
          printf("NOME: ");
          fgets(nome3, 30, stdin);
          printf("SEXO [M/F]: ");
          sexo3 = getchar();
          printf("NOTA: ");
          scanf("%f", &nota3);
      
          int quebra1 = strcspn(nome1, "\n");
          nome1[quebra1] = '\0';
          int quebra2 = strcspn(nome2, "\n");
          nome2[quebra2] = '\0';
          int quebra3 = strcspn(nome3, "\n");
          nome3[quebra3] = '\0';
      • #63648
        Tutora Mayla
        Mestre

        Rafael, parabéns por ter encontrado a solução do seu problema! Continue assim se dedicando que chegará muito longe!

        No caso de qualquer dúvida, estamos a disposição.

    • #64573

      Pelo que eu andei lendo, esses comandos: fflush, gets, getchar … são antigos e foram substituídos por outros. Não seria bom atualizar o curso?

      • #65058
        Tutora Mayla
        Mestre

        Claudio, obrigada pela sugestão iremos enviar ao setor responsável.
        Quaisquer dúvidas basta entrar em contato.

      • #66837
        Gabriel Drumond
        Participante

        Eles foram substituídos por quais comandos?

      • #67071
        Tutora Mayla
        Mestre

        Gabriel, o comando fflush(stdin) não faz parte do padrão do C, logo cada compilador vai tratá-lo de forma diferente. No lugar do fflush pode-se usar o getchar() para tentar limpar o buffer do teclado, mas não é exatamente a mesma coisa.
        Já o gets() pode ser substituído pelo fgets(variavel, tamanhoMaximo, stdin). O fgets() fará a leitura de uma sequência de caracteres até que seja dado enter, ou seja, até encontrar um \n. O tamanho máximo especificado fará com que a leitura seja encerrada mesmo que não haja o enter, o limite será sempre um a menos que o tamanho informado por conta do caractere que informa o fim da string.

        Espero ter ajudado, caso a dúvida persista volte a entrar em contato.

    • #64694

      Consegui resolver, troquei o linux mint pelo windows 10.

      • #83491

        Poderia ter trocado o fflush(stdin) por __fpurge(stdin) conforme mencionou o Stephen algumas respostas acima, ao invés de trocar de sistema operacional.
        Exemplo abaixo usando scanf() no primeiro caractere e getchar() no segundo. Funcionou perfeitamente em Linux Debian (que é o SO base do Mint).

        Versão do gcc:
        $gcc –version
        gcc (Debian 10.2.1-6) 10.2.1 20210110

        Código (apenas o main):
        char caractere1;
        char caractere2;

        printf(“\nDigite um caractere: “);
        __fpurge(stdin);
        scanf(“%c”, &caractere1);
        printf(“\nDigite uma cadeia de caracteres qualquer: “);
        __fpurge(stdin);
        caractere2 = getchar();
        printf(“\nVocê digitou os caracteres: \”%c\” e \”%c\””, caractere1, caractere2);

    • #72602
      RICARDO MELO
      Participante

      #include <stdio.h>
      #include <stdlib.h>
      #include <locale.h>
      #include <time.h>
      #include <string.h>

      int main(){
      setlocale(LC_ALL, “Portuguese”);
      char nome1[20], nome2[20], nome3[20];
      char sexo1, sexo2, sexo3;
      float nota1, nota2, nota3;
      { printf(“Cadastrando a primeira pessoa:\n——————————\nNome: “);
      fgets(nome1, 20, stdin);
      fflush(stdin);
      printf(“\nSexo[M/F]: “);
      fflush(stdin);
      scanf(” %c”, &sexo1);
      fflush(stdin);
      printf (“\nNota:”);
      fflush(stdin);
      scanf (“%f”, &nota1);
      fflush(stdin);

      }
      {
      printf(“\nCadastrando a segunda pessoa:\n——————————\nNome: “);
      fflush(stdin);
      fgets(nome2, 20, stdin);
      fflush(stdin);
      printf(“\nSexo[M/F]: “);
      fflush(stdin);
      scanf(” %c”, &sexo2);
      fflush(stdin);
      printf (“\nNota:”);
      fflush(stdin);
      scanf (” %f”, &nota2);

      }

      {
      printf(“\nCadastrando a terceira pessoa:\n——————————\nNome: “);
      fgets(nome3, 20, stdin);
      fflush(stdin);
      printf(“\nSexo[M/F]: “);
      fflush(stdin);
      scanf(” %c”, &sexo3);
      fflush(stdin);
      printf (“\nNota:”);
      fflush(stdin);
      scanf (” %f”, &nota3);
      }

      }

      • #72726
        Tutora Mayla
        Mestre

        Ricardo, movi o seu tópico para um tópico já existente sobre o assunto. Antes de criar um tópico verifique se já existe algum tópico já existente sobre o assunto.

        Olhe a discussão que ocorreu aqui e veja se resolve o seu problema.

        Caso a dúvida persista, volte a entrar em contato que lhe ajudaremos.

    • #83013

      Olá! Meu sistema é linux mint e eu utilizei <__fpurge(stdin)> ao invés de <fflush(stdin)> e deu certo! Espero que ajude.

      • #142017
        Robério Sales
        Participante

        Olá, também uso o linux mint e hoje (2024) só preciso usar mesmo o espaço no scanf (” %c”, &r) por exemplo. Se colocar (“%c”, &r) não dá, mas com o espaço consegue-se.

    • #83020
      Tutora Vera
      Mestre

      João, agradecemos por compartilhar sua experiência, ela pode ajudar quem tiver dúvidas futuramente. Parabéns! Bons estudos. 🖖🤓

Visualizando 26 respostas da discussão
  • Você deve fazer login para responder a este tópico.