Ir ao conteúdo
  • Cadastre-se
GuhLelouch

Como usar o comando gets adequadamente? (Iniciante)

Recommended Posts

Olá, pessoal.

Há algum tempo venho tendo problemas para fazer algumas atribuições a variáveis do tipo char usando o gets. Ao construir as soluções, costumo receber os avisos "'gets' is deprecated..." e "comparison between pointer and integer [enabled by default]", e o programa não funciona como deveria ao rodá-lo. Gostaria de saber qual a origem desses erros usando gets e como solucioná-los, de uma maneira que não exija nenhum conhecimento avançado, tendo em vista que os exercícios que estou fazendo são referentes ao início de um livro para iniciantes e não deveria exigir conhecimento superior. Eu suponho que a solução seja simples, mas estou tendo dificuldades em encontrá-la.

Exemplo de exercício que estou tendo erro

Uma loja utiliza o código V para transação à vista e P para transação a prazo. Faça um programa que receba o código e o valor de 15 transações. Calcule e mostre:

-> o valor total das compras à vista;

-> o valor total das compras a prazo;

-> o valor total das compras efetuadas;

-> o valor da primeira prestação das compras a prazo, sabendo-se que essas serão pagas em três vezes.

Minha tentativa de solução falha

#include <stdio.h>
void main()
{
int n;
float valor, somaavista = 0, somaaprazo = 0, soma = 0;
char tipo[1];
for (n = 1; n <= 15; n++)
{
printf ("Digite o valor da transação: ");
scanf ("%f", &valor);
inicio:
printf ("Digite o tipo da transação (V - a vista; P - a prazo: ");
gets (tipo);
if (tipo=='V')
{
somaavista = somaavista + valor;
}
else if (tipo=='P')
{
somaaprazo = somaaprazo + valor;
}
else
{
printf ("Opcao invalida!");
goto inicio;
}
soma = soma + valor;
}
printf ("O valor total das compras a vista e: %6.2f", somaavista);
printf ("O valor total das compras a prazo e: %6.2f", somaaprazo);
printf ("O valor total das compras e: %6.2f", soma);
printf ("O valor da primeira prestacao das compras a prazo e: %6.2f", somaaprazo/3);
}

Obrigado, até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

GuhLelouch,

Como assim? Qual é a maneira correta de se fazer, então? Como posso solucionar este problema?

Declare tipo como char já que a ideia é guardar um caractere.

char tipo;

Depois, altere o scanf que faz a leitura do valor para:

scanf("%f%*c", &valor);

Desta forma, você lê o valor e descarta o newline (que iria atrapalhar nas outras leituras).

E para a leitura do tipo, use o seguinte:

scanf("%c%*c", &tipo);

Vi que tem dúvidas sobre strings em C. Dê uma lida no material abaixo:

http://www.mtm.ufsc.br/~azeredo/cursoC/aulas/c500.html

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda, já ajudou bastante. Agora está funcionando. =)

Mas eu ainda não entendi muito bem, pois o livro que estou utilizando não comentou nada sobre isso antes. Quando, então, eu posso usar gets? E qual o significado desse %*c que precisei colocar nos dois scanf?

Valeu, até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guh,

Quando, então, eu posso usar gets? E qual o significado desse %*c que precisei colocar nos dois scanf?

Valeu, até mais.

Aquele %*c faz com que o scanf leia e descarte o último caractere lido pelo teclado, que normalmente é o newline (o Enter pressionado). Apesar de não estar contido na string ou valor lido, ele permanece no buffer. Sem isso, você iria perceber que a próxima leitura simplesmente seria "ignorada". Faça um teste sem aquela máscara para ver o que acontece...

Quanto ao gets().. bom, no seu caso, não seria conveniente, pois você precisava da leitura de apenas um caractere. O gets() faz a leitura de strings; e para comparar strings, você precisa lançar mão de função (strcmp()).

Sugiro fortemente a leitura no link abaixo sobre o assunto, pois é bastante didático. Tudo que fosse explanar aqui acerca do assunto, seria mera repetição.

http://www.inf.ufpr.br/nicolui/grad/ci067/Docs/NotasAula/notas-26_Strings.html

Depois da leitura, em dúvidas, é só perguntar..

Um abraço,

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×