Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal estou usando o DEVC++ e me deparei com a seguinte situação no meu código.

 

#include <stdio.h>
#include <stdlib.h>
main()
{
char nome[50];

printf("Digite seu nome: "); scanf("%[^\n]s",nome);

}

 

Até ai tudo bem, só que quando eu fui incrementando mais funções no meu código, mais pra frente na hora de rodar ele no prompt ele deu erro, pesquisei sobre e vi que o problema era de buffer do teclado, a solução era fácil eu precisava apenas dar um espaço entre " e % no scanf do código mostrado acima, entretanto gostaria de saber se tem outro jeito de limpar o buffer, e se esse erro de buffer só está acontecendo porque eu coloquei uma função para ler a string com espaços.

 

Desde já agradeço galera :)

Postado

Olá, tudo bem?

 

 

Então, essa solução que você menciona para resto em buffer só é válida quando trata de caracteres não gráficos (de espeço em branco) todo o resto persistirá. Para esse situação em particular, naturalmente scanf sempre vai deixar '\n' para traz. Basta escrever um getchar () logo depois para pegá-lo.

scanf ("%[^\n]", nome);  getchar ();  /* ENTER( '\n' ) */

 

 

Como getchar pega um a um dos caracteres. A maneira mais geral de resolver é ler tudo que se encontra no stdin até o fim do arquivo - EOF. Para todos as situações. purgar_stdin: limpará o buffer padrão de entrada do programa.

void purgar_stdin (void) {
  
      for (char ch =  getchar (); 
                  (ch  !=  '\n') && (ch  !=  EOF);
                        ch =  getchar ()) {}
      
      return  ; }

 

 

O.K !? Tchau.

 

  • Amei 1
Postado

@Waldir.M Olá. Tem sim. Vou passar duas funções próprias para isso:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}
void fflush_stdin() {
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

Para usar essas funções seria dessa forma:

printf("Digite seu nome: ");
scanf("%[^\n]",nome);
limpa_linha();       // ou fflush_stdin();

É só chamar a função q gostar mais depois de cada scanf

adicionado 0 minutos depois

@AnsiC Ops.. Foi mais rápido rs...

Postado

@giu_d kkk!

 

Foi bom, são sinônimos, pois claramente fazem de formas diferentes a mesma coisa, o que difere é na criatividade de tem cada uma das soluções. Por isso que C é a melhor.

 

 

Tchau.

  • Curtir 1
Postado

@giu_d Obrigado amigo, não entendi o que você disse na primeira parte mas quando você demonstrou como eu posso usar efetivamente a função eu entendi, é que eu sou novo em programação então ainda me enrolo em algumas coisas mas de qualquer forma obrigado mesmo mano, se puder explicar de uma forma mais fácil o que você quis dizer com aquela parte de void e EOF ajudaria muito hehe...

adicionado 4 minutos depois

@AnsiC Fala ae mano, não entendi muito bem para o que serve a função getchar (); /* ENTER( '\n' ) */.

Tem como explicar de um jeito mais fácil kkk, desculpa ter que fazer explicar tudo novamente é que eu sou novo então ainda não entendo muito bem como algumas funções funcionam de fato...

Postado

@Waldir.M Olá. void é o tipo de retorno da função, ou seja, a função não retorna nada.

E quanto a macro EOF se refere a End Of File, ou fim de arquivo

Se você inda está começando e programar é normal surgir dúvidas mesmo, mas assim q você estudar sobre funções vai aprender sobre tipo de retorno de uma função, mas é como costumo dizer, é passo a passo, degrau por degrau

Explicar assim em algumas linhas sobre funções ficaria difícil hehe

Resumindo: Uma função tem o tipo de retorno void porque não retorna nada, que é o caso das duas funções que passei

 

Qualquer dúvida é só perguntar. Gosto quando a pessoa pergunta mesmo rs...  Isso demonstra que ela tem interesse em aprender :thumbsup:

Postado
11 horas atrás, Waldir.M disse:

getchar (); /* ENTER( '\n' ) */.

... Aqui a função é getchar (); a função captura um caractere, antes digitado no fluxo padrão de entrada do teclado -- stdin, e retorna-o para o bloco. Caso não exista nada no buffer do teclado, a função aguarda até que o ENTER seja pressionada para o começar a captura pelo primeiro caractere que ainda está no buffer (memória) do teclado. Se falhar na captura ou se o buffer atingir seu fim, a função retorna o padrão EOF.  

 

Ilustração:

int main (void)
      {
      int tecla =  0;

      printf ("Digite uma coisa do teclado, e somente depois disso tecle a ENTER\n");
      printf ("Digite a tecla 0 e depois disso a ENTER para finalizar.\n\n");
      while ((tecla =  getchar ())  !=  EOF)
            {
            printf ("O usuario digitou a [tecla]: %c\n", tecla);
            if (tecla  ==  '0')
                  {
                  printf ("O.k. Tchau!\n\n");
                  break;
                  }
            getchar (); /**< Esse ´getchar´ vai descartar o ENTER digitado */
            }

      return 0;
      }

O.k. !? Tchau.

  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!