Home Fóruns Linguagem C M01A08

Visualizando 1 resposta da discussão
  • Autor
    Posts
    • #160810
      Franklin Ferreira
      Participante

      Algumas instruções parecem não funcionar mais da mesma forma. Trabalhar com me pareceu complicado, mas vou compartilhar o que entendi e espero que ajude alguém. E, claro, fiquem à vontade para me corrigir se eu estiver errado.

      Para entrada de string, utiliza-se: fgets(variável, tamanho, stdin);
      Para entrada de char, pode-se usar: scanf(” %c”, &variável); ou variável = getchar();

      Entretanto, para trabalhar com o char parece surgir algumas regrinhas:
      – Se houver um variável = getchar(); seguido (não necessariamente na linha seguinte) de outro variável = getchar();, é necessário inserir um getchar(); entre eles para limpar o bufffer.
      – Se houver um scanf(“formatação”, &variável); seguido de um variável = getchar();, também é necessário um getchar(); intermediário.
      – Já se a ordem for variável = getchar(); seguido de um scanf(“formatação”, &variável);, o código funcionará corretamente.

      O problema está no uso correto do getchar(); em relação ao buffer.
      – scanf lê apenas o que precisa e deixa o \n (quebra de linha) no buffer. Se já houver um \n, é ele que será lido na próxima operação, caso não haja outro caractere.
      – getchar lê um único caractere do buffer, incluindo o \n. Por isso, pode acabar lendo apenas a quebra de linha se o buffer não for limpo antes.
      – fgets() lê – até o \n ou até atingir o limite de caracteres. Por isso, é o único que não interfere negativamente no buffer.

      Esse é meu código, tentei deixa-lo da forma mais limpa possível:

      #include <stdio.h>
      #include <locale.h>

      void main(){
      setlocale(LC_ALL, “Portuguese”);

      char nome1[30], nome2[30], nome3[30];
      char sexo1, sexo2, sexo3;
      float nota1, nota2, nota3;

      //——————————————
      printf(“Cadastrando primeira pessoa:\n”);
      printf(“Nome: “);
      fgets(nome1, sizeof(nome1), stdin);

      printf(“Sexo [M/F]: “);
      sexo1 = getchar();

      printf(“Nota: “);
      scanf(“%f”, &nota1);
      getchar();

      //——————————————
      printf(“Cadastrando segunda pessoa:\n”);
      printf(“Nome: “);
      fgets(nome2, sizeof(nome2), stdin);

      printf(“Sexo [M/F]: “);
      sexo2 = getchar();

      printf(“Nota: “);
      scanf(“%f”, &nota2);
      getchar();

      //——————————————
      printf(“Cadastrando terceira pessoa:\n”);
      printf(“Nome: “);
      fgets(nome3, sizeof(nome3), stdin);

      printf(“Sexo [M/F]: “);
      sexo3 = getchar();

      printf(“Nota: “);
      scanf(“%f”, &nota3);

      //——————————————
      printf(“NOME\t\tSEXO\tNOTA\n”);
      printf(“%s\t\t%c\t%0.1f\n”, nome1, sexo1, nota1);
      printf(“%s\t\t%c\t%0.1f\n”, nome2, sexo2, nota2);
      printf(“%s\t\t%c\t%0.1f\n”, nome3, sexo3, nota3);
      }

    • #160811
      Tutora Jessica
      Moderador

      Ola Franklin,
      Sua explicação sobre o uso de fgets(), scanf() e getchar() está muito boa! Você entendeu bem como essas funções funcionam e como lidar com o buffer de entrada.

      Algumas dicas a mais para ajudar:

      – O uso de getchar() para limpar o buffer é uma técnica comum, mas não é a única solução. Outras opções incluem usar scanf() com um espaço antes do formato (" %c"), como você mencionou, ou usar fgets() seguido de sscanf() para ler os dados.

      – Seu código está bem estruturado e fácil de seguir. Uma sugestão é considerar usar uma função para cadastrar cada pessoa, para evitar repetição de código.

      Para entrada de string, uso fgets(variável, tamanho, stdin). Para entrada de char, posso usar scanf(" %c", &variável) ou variável = getchar().

      No entanto, ao trabalhar com char, é importante considerar o buffer de entrada. Aqui estão alguns pontos importantes:

      – Se houver um variável = getchar() seguido de outro variável = getchar(), é necessário inserir um getchar() entre eles para limpar o buffer.

      – Se houver um scanf("formatação", &variável) seguido de um variável = getchar(), também é necessário um getchar() intermediário.

      – Já se a ordem for variável = getchar() seguido de um scanf("formatação", &variável), o código funcionará corretamente.

      Isso ocorre porque scanf() deixa o \n (quebra de linha) no buffer, e getchar() lê um único caractere do buffer, incluindo o \n. Já fgets() lê até o \n ou até atingir o limite de caracteres, e não interfere negativamente no buffer.

      Espero que isso ajude! Se tiver alguma dúvida ou precisar de mais ajuda, sinta-se à vontade para perguntar 🖖🏼

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