Home › Fóruns › Linguagem C › M01A08
- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 1 semana atrás por
Tutora Jessica.
-
AutorPosts
-
-
21 de agosto de 2025 às 13:37 #160810
Franklin Ferreira
ParticipanteAlgumas 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”, ¬a1);
getchar();//——————————————
printf(“Cadastrando segunda pessoa:\n”);
printf(“Nome: “);
fgets(nome2, sizeof(nome2), stdin);printf(“Sexo [M/F]: “);
sexo2 = getchar();printf(“Nota: “);
scanf(“%f”, ¬a2);
getchar();//——————————————
printf(“Cadastrando terceira pessoa:\n”);
printf(“Nome: “);
fgets(nome3, sizeof(nome3), stdin);printf(“Sexo [M/F]: “);
sexo3 = getchar();printf(“Nota: “);
scanf(“%f”, ¬a3);//——————————————
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);
} -
21 de agosto de 2025 às 13:47 #160811
Tutora Jessica
ModeradorOla Franklin,
Sua explicação sobre o uso defgets()
,scanf()
egetchar()
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 usarscanf()
com um espaço antes do formato (" %c"
), como você mencionou, ou usarfgets()
seguido desscanf()
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 usarscanf(" %c", &variável)
ouvariá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 outrovariável = getchar()
, é necessário inserir umgetchar()
entre eles para limpar o buffer.– Se houver um
scanf("formatação", &variável)
seguido de umvariável = getchar()
, também é necessário umgetchar()
intermediário.– Já se a ordem for
variável = getchar()
seguido de umscanf("formatação", &variável)
, o código funcionará corretamente.Isso ocorre porque
scanf()
deixa o\n
(quebra de linha) no buffer, egetchar()
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 🖖🏼
-
-
AutorPosts
- Você deve fazer login para responder a este tópico.