shadowam 0 Denunciar post Postado Maio 24, 2014 Prezados, sou iniciante em C e estou aprendendo um pouco de struct agora, mas em um dos meus primeiros programas está ocorrendo um erro que não consigo encontrar a solução. Deve ser algo muito simples mas que não aprendi. O problema é que no final do programa, para 'mostrar os cadastros', a variável NOME sempre sai com os valores da DATAEXP, e não sei como resolver isso... Se puderem ajudar ficarei grato! Abaixo seguem o código e uma foto do problema. #include <stdio.h> #include <stdlib.h> // Criar um registro do cadastro de 10 alunos com o nome, número, // rg e data de nascimento e apresentar o resultado. int main() { int i; struct rg{ int num; char dataexp; char nome[50]; char nasc[50]; char natur[50]; char nomemae[50]; char nomepai[50]; }; struct rg cad [2]; //fazendo com 2 para testar for (i=0;i<2;i++) { printf("\n*** Cadastro do %d RG ***\n", i+1); printf("\nInforme o nome: "); gets(cad[i].nome); printf("\nInforme o numero do RG: "); scanf("%d%*c", &cad[i].num); printf("\nInforme a data de expedicao: "); gets(&cad[i].dataexp); printf("\nInforme a data de nascimento: "); gets(cad[i].nasc); printf("\nInforme o nome da mae: "); gets(cad[i].nomemae); printf("\nInforme o nome do pai: "); gets(cad[i].nomepai); } printf("\n****************************************"); printf("\n*** Cadastros efetuados com sucesso! ***"); printf("\n****************************************\n"); for (i=0;i<2;i++) { printf("\nNome: %s", &cad[i].nome); printf("\nRG Numero: %d", cad[i].num); printf("\nData de expedicao: %s", &cad[i].dataexp); printf("\nData de nascimento: %s", &cad[i].nasc); printf("\nNome da mae: %s", &cad[i].nomemae); printf("\nNome do pai: %s\n", &cad[i].nomepai); } getch(); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
TalissonBento 14 Denunciar post Postado Maio 24, 2014 Cara, o seu problema está na declaração de char dataexp logo em seguida vc declara char nome[50] O que acontece é que sua variável dataexp tem capacidade de armazenar apenas 1 caracter, imagine que com esta declaração essa variável seja alocada no endereco 0x000031. Logo sua variável nome que pode armazenar 50 caracteres, é alocada ao lado de 0x000031(dataexp) com endereco 0x000032 e o endereço final 0x000082(0x000032 + 50), então quando você pegar uma cadeia de caracteres com gets, como a data 10/10/2005, o 10/10/2005 é armezenado na variável dataexp e o restante "ultrapassa o limite" e invade o espaço da variável nome que tbm contém o '\0' para finalizar a leitura; Veja que sua saida da variável nome não exibe o primeiro valor, pois a leitura começa em 0x000032(espaço de nome); seu problema será resolvido se vc definir dataexp com mais espaço, ou seja, 8. Compartilhar este post Link para o post Compartilhar em outros sites
shadowam 0 Denunciar post Postado Maio 24, 2014 Muito obrigado Talisson! Sabia que era algo simples mas não consegui encontrar, ficava olhando todo o código e esqueci de verificar as variáveis, hehe. Agora funcionou direitinho, obrigado pela ótima explicação! Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Maio 24, 2014 Tire esse gets daí e use fgets. Compartilhar este post Link para o post Compartilhar em outros sites
Gustavo Stehling 0 Denunciar post Postado Maio 24, 2014 Meio que OFF do tópico, mas só uma coisa, quando costumo fazer cadastros e testar o programa completo(15 registros) costumo usar system ("cls"); apenas por questão visual. Espero que seja útil Compartilhar este post Link para o post Compartilhar em outros sites