Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas Com Gets Em Struct


Guest --Alan --

Pergunta

Guest --Alan --

Olá pessoal.

Estou tendo um problema ao usar gets() em um char[51] que faz parte de uma struct.

Compilo e não tenho qualquer erro, mas quando vou testar a entrada da variável "nome" simplesmente é ignorada e a execução passa para a entrada do salário. Estou usando o Dev C++ para compilar. O que pode ser isso?

Se eu fizer o gets() uma vez apenas, fora do for, não dá problema.

Vou colocar os trechos que considero importantes do código. Se alguém puder me ajudar, agradeço.

[]s

Alan

int main() {
  struct registro {
    int RF;
    float salario;
    char nome[51];
  } funcionarios[5];

  int i;
  
  for (i=0; i<5; i++) {
    printf("\nDigite o registro do funcionario: ");
    scanf("%d", &funcionarios[i].RF);
    printf("Digite o nome do funcionario: ");
    gets(funcionarios[i].nome);
    printf("Digite o salario do funcionario: ");
    scanf("%f", &funcionarios[i].salario);
  }

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

nesse trecho por exemplo: scanf("%d", &funcionarios.RF);

voce digita o número e o número é armazenado em funcionarios.RF, porém o "enter" é passado pra frente.

Então seu gets recebe "enter" como nome do funcionario e passa para a próxima instrução.

Para evitar isso podemos usar o getchar.

for (i=0; i<5; i++) {
    printf("\nDigite o registro do funcionario: ");
    scanf("%d", &funcionarios[i].RF);
    getchar();

    printf("Digite o nome do funcionario: ");
    gets(funcionarios[i].nome);

    printf("Digite o salario do funcionario: ");
    scanf("%f", &funcionarios[i].salario);
    getchar();
  }

;)

Link para o comentário
Compartilhar em outros sites

  • 0

Dessa forma como você falou não daria certo pois não teria como capturar o valor correto de cada RF, nome e salario.

Outra ponto importante:

O uso do gets() está sendo abandonado por ser considerado um comando "perigoso" e até mesmo não está mais sendo aceito pelas IDES atuais, como o Visual Studio.  Para substituir o gets() surgiu o fgets(), mas o fgets() tem uma implementação um pouco mais avançada. Daria para usar tbém o scanf() mesmo para se ler uma String, como no exemplo abaixo:

for (i=0; i<5; i++) 
{
    printf("\nDigite o registro do funcionario: ");
    scanf("%d", &funcionarios[i].RF);
    scanf("%c" &limparBuffer); // Essa linha é ignorada pelo compilador. Serve para limpar o buffer de entrada

    printf("Digite o nome do funcionario: ");
    scanf("%s" &funcionarios[i].nome);
    scanf("%c" &limparBuffer); // Essa linha é ignorada pelo compilador. Serve para limpar o buffer de entrada

    printf("Digite o salario do funcionario: ");
    scanf("%f", &funcionarios[i].salario);
    scanf("%c" &limparBuffer);   // Essa linha é ignorada pelo compilador. Serve para limpar o buffer de entrada
}

Outro ponto q vi no seu código é q você criou uma struct dentro método main(), e, pelo q sei, isso não é uma boa prática de programação ( pelo menos pelo q estudei até aqui de C).

Para ficar melhor seu código segue uma sugestão:

#include "stdio.h"

struct registro 
{
    int RF;
    float salario;
    char nome[51];
} funcionarios[5];


int main() {
  
	int i;
	char *limparBuffer;
  
  	for (i=0; i < 5; i++) 
	{
    	printf("\nDigite o registro do funcionario: ");
    	scanf("%d", &funcionarios[i].RF);
    	scanf("%c", &limparBuffer);

    	printf("Digite o nome do funcionario: ");
    	scanf("%s", &funcionarios[i].nome);
    	scanf("%c", &limparBuffer);

 	    printf("Digite o salario do funcionario: ");
        scanf("%f", &funcionarios[i].salario);
        scanf("%c", &limparBuffer);
    	
  	}
  	
  	for (i = 0; i < 5; i++)
  	{
  		printf("\nO funcionario com RF numero %d, com o nome de %s, recebe o salario de %.2f", funcionarios[i].RF, 
		  funcionarios[i].nome, funcionarios[i].salario);
	  }
  
  return 0;
  
}

 

Os comandos 

scanf("%c", &limparBuffer);

servem para limpar o buffer de entrada, para q na próxima leitura de dados não sejam lidos valores "sujos".

O Kandrade sugeriu o uso do getchar(), mas eu costumo usar nos meus códigos a forma q passei p você agora.

Tbém fiz um pequeno exemplo de como imprimir os dados inseridos, como o RF, nome e salário

 

Editado por Visitante
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...