vega! 0 Denunciar post Postado Novembro 29, 2009 Ola, boa tarde! To quebrando a cabeça com um fato que não consegui resolver.. Por isso peço ajuda. Eu criei 3 estruturas dentro do meu programa. Uma estação, um trem e um passageiro. No código , o usuário digita os atributos de cada um. O problema é que ao rodar o programa, ele passa direto pela fase das atribuições e atribue qualquer valor. O que posso conferir na ultima parte do código aonde verifico os valores atribuidos O que ja fiz: - Tentei mudar o nome dos atributos , diferenciando das outras estruturas. Cheguei a deixar pas_1.pas_1.nome.. trem_1.trem_1.nome ( sem sucesso) - Tentei antes das atribuições, alterar o valor para 0, tb sem sucesso. Se deixo "" (vazio) , da erro. Segue o código #include<stdio.h> #include<conio.h> int main(){ struct estacao { // Cria estrutura estação int numero; char nome[50]; int capacidade; int lotacao_atual; }; struct trem { // Cria estrutrua trem int numero; int velocidade; int capacidade; int lotacao_atual; int est_inicial; int est_final; }; struct passageiro { // Criar estrutrua passageiro int CPF[11]; char nome[30]; int est_inicial; int est_final; int est_atual; int trem_atual; }; struct estacao est_1; //declarar estacao struct passageiro pas_1; //declarar passageiro struct trem trem_1; //declarar trem printf (" **** PROGRAMINHA DE ESTACOES **** " ); printf ("---------------------------------- " ); printf("\n\n\n\n\n\n"); // Inicio criação estações printf("Criando estação..."); printf("\n\n"); printf("Numero da estacao:"); scanf("%d" , &est_1.numero); printf("Capacidade:"); scanf("%d" , &est_1.capacidade); printf("Lotacao Atual:"); scanf("%d" , &est_1.lotacao_atual); printf("Nome:"); scanf("%d" , &est_1.nome); // Fim criação estações // Inicio criação trens //Inicio da tentativa de resolver o problema alocando 0 ao atributo trem_1.numero=0; trem_1.velocidade=0; trem_1.capacidade=0; trem_1.lotacao_atual=0; trem_1.est_inicial=0; trem_1.est_final=0; //Fim da tentativa de resolver o problema alocando 0 ao atributo printf("Criando trem..."); printf("\n\n"); printf("Numero do trem:"); scanf("%d" , &trem_1.numero); printf("Velocidade do trem:"); scanf("%d" , &trem_1.velocidade); printf("Capacidade:"); scanf("%d" , &trem_1.capacidade); printf("Lotacao Atual:"); scanf("%d" , &trem_1.lotacao_atual); printf("Estacao Inicial:"); scanf("%d" , &trem_1.est_inicial); printf("Nome:"); scanf("%s" , &trem_1.est_final); // Fim criação trens // Criação de passageiros printf("Criando passageiro..."); printf("\n\n"); printf("Nome do passageiro:"); scanf("%s" , &pas_1.nome); printf("CPF:"); scanf("%d" , &pas_1.CPF); printf("Estacao Atual:"); scanf("%d" , &pas_1.est_atual); printf("Estacao Inicial:"); scanf("%d" , &pas_1.est_inicial); printf("Estacao FInal:"); scanf("%d" , &pas_1.est_final); printf("Trem Atual:"); scanf("%s" , &pas_1.trem_atual); // Fim criação passageiros // Conferindo.. printf("Estacoes\n\n"); // Conferindo estacao printf("Nome: %s\n" , est_1.nome); printf("Numero: %d\n" , est_1.numero); printf("Numero: %d\n" , est_1.capacidade); printf("Numero: %d\n" , est_1.lotacao_atual); printf("\n\nTrens\n\n"); // Conferindo trens printf("Numero: %d\n" , trem_1.numero); printf("Capacidade: %d\n" , trem_1.capacidade); printf("Velocidade: %d\n" , trem_1.velocidade); printf("Lotacao Atual: %d\n" , trem_1.lotacao_atual); printf("Estacao Inicial: %d\n" , trem_1.est_inicial); printf("Estacao Final: %d\n" , trem_1.est_final); printf("\n\nPassageiros\n\n"); // Conferindo passageiros printf("Nome: %s\n" , pas_1.nome); printf("CPF: %d\n" , pas_1.CPF); printf("Estacao Atual: %d\n" , pas_1.est_atual); printf("Trem Atual: %d\n" , pas_1.trem_atual); printf("Estacao Inicial: %d\n" , pas_1.est_inicial); printf("Estacao Final: %d\n" , pas_1.est_final); scanf("\n"); } Eis a tela: Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
vega! 0 Denunciar post Postado Novembro 29, 2009 Resolvido: O comando fflush(stdin); limpa o buffer do teclado e nesse caso resolveu o problema e ele parou de ficar atribuindo valores "do nada" para as minhas variaveis. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Novembro 30, 2009 Bom você postou na área errada. - Seu problema foi resolvido?? bem até que foi neh, só que não é aconselhavel resolver da maneira que você utilizou, o correto é usar um token para extrair o '\n' da string. []s --- Título Editado Lógica de Programação e Algoritmos http://forum.imasters.com.br/public/style_emoticons/default/seta.gif C/C++ Compartilhar este post Link para o post Compartilhar em outros sites
iCl4w 0 Denunciar post Postado Dezembro 1, 2009 Usando token: scanf("%s*c",&string); Melhor que o fflush(stdin) e mais limpo! Abçs... Compartilhar este post Link para o post Compartilhar em outros sites
vega! 0 Denunciar post Postado Dezembro 3, 2009 Usando token: scanf("%s*c",&string); Melhor que o fflush(stdin) e mais limpo! Abçs... Brigado gente. Descobri que scanf não aceita espaço. retirei os espaços e parou de dar o problema também Muito obrigado Compartilhar este post Link para o post Compartilhar em outros sites
iCl4w 0 Denunciar post Postado Dezembro 5, 2009 scanf aceita espaços sim! basta um: scanf("%[^\n]",string); Esse operador armazena tudo na string até "ver" \n, ou seja até você dar enter, lendo também os espaços! o scanf("%s",string) enxerga o espaço como ponto final, no comando anterior ele enxerga o \n como esse ponto final. Só mais uma dica... Abçs... Compartilhar este post Link para o post Compartilhar em outros sites
echo "VINICIUS" 3 Denunciar post Postado Dezembro 6, 2009 faça a leitura de strings em C da seguinte forma primeiro trabalhe com a biblioteca string.h ficaria assim #include<stdio.h> #include<string.h> main(){ fflush(stdin); //faz leitura do buffer do teclado por isso o nome esta recebendo funda da string anterior que recebeu barra funda fgets(variavel,tamanho,stdin); // corresponde ao scanf no seu caso ficaria fgets(pas_1.nome,30,stdin); } Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Dezembro 6, 2009 Vinicius, não é por nada, mas o pessoal ja comentou que NÃO se deve utilizar fflush(stdin), ja explicamos 12131234123123 vezes o porquê disso, e como resolver o problema da forma correta... Inclusive, existe um tópico em laboratório de códigos fontes (C/C++) falando sobre isso. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Dezembro 10, 2009 Não é possivel que aki no fórum de C/C++ o pessoal ainda me fala desse fflush(stdin); Existem tópicos que deveriam ser de leitura obrigatória pra pessoa poder acessar o fórum. []s Compartilhar este post Link para o post Compartilhar em outros sites
Dee 0 Denunciar post Postado Dezembro 10, 2009 Não é possivel que aki no fórum de C/C++ o pessoal ainda me fala desse fflush(stdin); Existem tópicos que deveriam ser de leitura obrigatória pra pessoa poder acessar o fórum. []s Se você não quer, coloque 'fflush(stdin)' na censura de palavras do forum de C/C++. Desencana cara, o artigo explicando tah ae no fórum, lê quem quer e quem quiser se aprofundar. Coloca fonte tamanho 24 pra todo mundo ler. Mas se mesmo lendo, tem gente usando ainda, deixa. Pt perseguição. Em todo tópico que alguem postar um programa aqui e tiver fflush(stdin), gets() e system("pause"), vcs vao ficar com essas frescuras ? ajuda a pessoa e boa e no final do seu Post você fala "Leia este artigo sobre FFLUSH(STDIN) - Recomendado." Pronto! Simples, educado e acabou. O usuário Lê se quiser. PS: desculpem o flood, mas você tabm floodou Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Dezembro 10, 2009 Não acredito que você vai contra quem quer ajudar? 1º O programa é meu??? R: Não, a pessoa vem aki pedir auxílio e a gente tenta da melhor maneira passar "boas práticas" de programação. Com ctz cabe a ela se irá seguir ou não. 2º Eu usei sim um tom de ironia quando disse isso, + n acho motivo de revolta, ueh, aki é pra movimentar idéias. 3º Educado seria as pessoas antes de criar o tópico usar a busca do fórum, ler as regras e não as violarem. No mais amigo, qlqr coisa me mande MP que a gente conversa numa boa, n vamos estender esse assunto aki ok?! []s Compartilhar este post Link para o post Compartilhar em outros sites