Home › Fóruns › Linguagem C › O comando fflush(stdin); não está funcionando
- Este tópico contém 38 respostas, 13 vozes e foi atualizado pela última vez 3 meses atrás por Robério Sales.
-
AutorPosts
-
-
12 de fevereiro de 2021 às 21:44 #60620Claudio Filipe Dalalba RibeiroParticipante
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. -
12 de fevereiro de 2021 às 22:14 #60621Claudio Filipe Dalalba RibeiroParticipante
O comando gets(valor); também não funciona.
-
13 de fevereiro de 2021 às 00:07 #60629José Vinícius Silva FerreiraParticipante
Poderia me mandar seu código?
-
13 de fevereiro de 2021 às 01:26 #60632Claudio Filipe Dalalba RibeiroParticipante
#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);
}
-
-
13 de fevereiro de 2021 às 01:18 #60630Claudio Filipe Dalalba RibeiroParticipante
#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);
} -
13 de fevereiro de 2021 às 01:23 #60631Claudio Filipe Dalalba RibeiroParticipante
Desculpa, digitei errado, eu digitei pelo celular.
-
13 de fevereiro de 2021 às 01:31 #60633Claudio Filipe Dalalba RibeiroParticipante
#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);
}-
1 de fevereiro de 2022 às 04:33 #85315RICARDO MELOParticipante
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”, ¬a1);
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”, ¬a2);
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”, ¬a3);
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);}
-
2 de fevereiro de 2022 às 09:18 #85361Tutora VeraMestre
Ricardo, agradecemos contribuir com sua experiência. Parabéns e bons Estudos. 🖖
-
-
13 de fevereiro de 2021 às 01:32 #60634Claudio Filipe Dalalba RibeiroParticipante
O comando gets também não está funcionando
-
13 de fevereiro de 2021 às 16:57 #60681José Vinícius Silva FerreiraParticipante
Uma pergunta, vc está tentando fazer os exercícios em algum editor pra celular ou em um computador mesmo?
-
13 de fevereiro de 2021 às 17:14 #60682Claudio Filipe Dalalba RibeiroParticipante
Computador.
Uso Codeblocks 20.03 no Ubuntu 20.04
-
-
13 de fevereiro de 2021 às 20:59 #60697José Vinícius Silva FerreiraParticipante
Olha, faz tempo q eu não uso o ubuntu, mas vc poderia tentar atualizar ou quem sabe fazer um downgrade no compilador.
-
13 de fevereiro de 2021 às 21:53 #60703thiago perez novasParticipante
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.
-
13 de fevereiro de 2021 às 22:05 #60704Claudio Filipe Dalalba RibeiroParticipante
Mudei pra Linux mint 20.1 de agora o #include <stdio.h> não funciona mais.
-
14 de fevereiro de 2021 às 12:11 #60739thiago perez novasParticipante
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.
-
15 de fevereiro de 2021 às 12:16 #60824Tutora MaylaMestre
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. -
16 de fevereiro de 2021 às 06:48 #60902Stephen Dias BarretoParticipante
Para limpar o buffer em Linux, use: __fpurge(stdin)
-
26 de fevereiro de 2021 às 11:41 #61843Daniel Ramos Villela CavaliniParticipante
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”.
-
26 de fevereiro de 2021 às 11:43 #61844Daniel Ramos Villela CavaliniParticipante
” %c” (com o espaço antes do %)
-
12 de março de 2021 às 00:20 #62838Rafael Alonso Barbosa SantosParticipante
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!
-
15 de março de 2021 às 19:42 #63141Tutora MaylaMestre
Rafael, poderia nos enviar um exemplo desses bugs que acontecem colando aqui as mensagens de erro que deram?
Sobre a funçãofgets()
, 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 tipochar[]
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:- Variável onde será armazenada o texto;
- 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; - 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.
-
-
16 de março de 2021 às 22:55 #63223Rafael Alonso Barbosa SantosParticipante
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! -
18 de março de 2021 às 22:29 #63444Tutora MaylaMestre
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 umprintf
tenha essa quebra de linha. Este comportamento não ocorre com a funçãogets
porém esta função sofre com alguns problemas de segurança.
Para continuar utilizando afgets
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çãostrcspn
da bibliotecastring.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.
-
19 de março de 2021 às 06:43 #63455Rafael Alonso Barbosa SantosParticipante
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", ¬a1); 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", ¬a2); 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", ¬a3); 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: 8Listagem Completa.
————————————
NOME SEXO NOTA
Rafael Santos
8.0
Eduarda S 0.0
ntos M 8.0
———————————— -
19 de março de 2021 às 06:48 #63456Rafael Alonso Barbosa SantosParticipante
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: 6Listagem Completa.
————————————
NOME SEXO NOTA
Rafael Santos
8.010.0
6.0
———————————— -
19 de março de 2021 às 16:58 #63485Rafael Alonso Barbosa SantosParticipante
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", ¬a1); printf("Cadastrar segunda pessoa: \n"); fflush(stdin); printf("NOME: "); fgets(nome2, 30, stdin); printf("SEXO [M/F] "); sexo2 = getchar(); printf("NOTA: "); scanf("%f", ¬a2); printf("Cadastrar terceira pessoa: \n"); fflush(stdin); printf("NOME: "); fgets(nome3, 30, stdin); printf("SEXO [M/F]: "); sexo3 = getchar(); printf("NOTA: "); scanf("%f", ¬a3); int quebra1 = strcspn(nome1, "\n"); nome1[quebra1] = '\0'; int quebra2 = strcspn(nome2, "\n"); nome2[quebra2] = '\0'; int quebra3 = strcspn(nome3, "\n"); nome3[quebra3] = '\0';
-
22 de março de 2021 às 19:49 #63648Tutora MaylaMestre
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.
-
-
9 de abril de 2021 às 00:10 #64573Claudio Filipe Dalalba RibeiroParticipante
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?
-
12 de abril de 2021 às 20:50 #65058Tutora MaylaMestre
Claudio, obrigada pela sugestão iremos enviar ao setor responsável.
Quaisquer dúvidas basta entrar em contato. -
11 de maio de 2021 às 15:21 #66837Gabriel DrumondParticipante
Eles foram substituídos por quais comandos?
-
13 de maio de 2021 às 20:41 #67071Tutora MaylaMestre
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 dofflush
pode-se usar ogetchar()
para tentar limpar o buffer do teclado, mas não é exatamente a mesma coisa.
Já ogets()
pode ser substituído pelofgets(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.
-
-
10 de abril de 2021 às 02:13 #64694Claudio Filipe Dalalba RibeiroParticipante
Consegui resolver, troquei o linux mint pelo windows 10.
-
31 de dezembro de 2021 às 10:09 #83491Ivan Meskauskas GneidingParticipante
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 20210110Có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);
-
-
31 de julho de 2021 às 13:50 #72602RICARDO MELOParticipante
#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”, ¬a1);
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”, ¬a2);}
{
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”, ¬a3);
}}
-
2 de agosto de 2021 às 19:35 #72726Tutora MaylaMestre
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.
-
-
21 de dezembro de 2021 às 12:32 #83013João Antônio CardosoParticipante
Olá! Meu sistema é linux mint e eu utilizei <__fpurge(stdin)> ao invés de <fflush(stdin)> e deu certo! Espero que ajude.
-
21 de agosto de 2024 às 09:06 #142017Robério SalesParticipante
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.
-
-
21 de dezembro de 2021 às 17:56 #83020Tutora VeraMestre
João, agradecemos por compartilhar sua experiência, ela pode ajudar quem tiver dúvidas futuramente. Parabéns! Bons estudos. 🖖🤓
-
-
AutorPosts
- Você deve fazer login para responder a este tópico.