Ir ao conteúdo
  • Cadastre-se

Como usar o comando gets adequadamente? (Iniciante)


GuhLelouch

Posts recomendados

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.

Link para o comentário
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

Link para o comentário
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.

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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...