vhbsouza 0 Denunciar post Postado Setembro 2, 2009 I ae galera! Eu to fazendo um prog de uma lista de exe do pessoal de faz prog 1 da minha faculdade. e tem um exe q fala sobre exibir o boi magro e o boi gordo ... em uma lista de nomes de bois e seus respectivos pesos. Dai eu falei q ia faze pra ajudar eles. Mais naum sei qq ta acontecendo e no arquivo de saida!! sai uns caracteres estourados.. alguém pode me ajudar? Meu código: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char boi[11],boiG[11],boiM[11]; float peso=0,gordo=0,magro=0; while(scanf("%s %f",&boi, &peso) && !EOF) { if(peso<=magro) { magro=peso; strcpy(boiM,boi); } if(peso>=gordo) { gordo=peso; strcpy(boiG,boi); } } printf("Boi Gordo: %s -> Peso: %f\n",boiG,gordo); printf("Boi Magro: %s -> Peso: %f\n",boiM,magro); return 0; } Entrada: input.txt bandido 100.44 valente 87.9 Saída: output.txt Boi Gordo: Õ³>w™§©_þÿÿÿ›—=wbandido -> Peso: 0.000000 Boi Magro: ˆ@ -> Peso: 0.000000 P.S.: Ele compila sem erros nem warnings SocorooooO! Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Setembro 2, 2009 Se não me engano pra ler em string você não põe a referência pra passar pro scanf. Você põe a variável direto sem o & pois a string já é um ponteiro. Parece que está pegando sujeira do buffer no scanf, tenta botar um %*c no final para limpar o buffer. Isso vai atrapalhar um pouco na leitura dos dados se não limpar o buffer. A propósito, aquilo que você viu ali é lixo, boiG e boiM pelo menos aqui não foram definidos para os dados entrados pois o programa nem passou pelo interior do while... "if(peso<=magro)" isso não vai funcionar porque magro começa em zero, então o peso que você vai entrar deve ser negativo para conseguir adicionar um boi como boi magro. Ou você inicia magro com um valor bem alto, ou você define o primeiro boi a ser adicionado como sendo ambos gordo E magro. "while(scanf("%s %f",&boi, &peso) && !EOF)" tem certeza??? esse EOF aí tá atrapalhando o processamento dos dados. Tira isso daí e arranja outra maneira de controlar as repetições. Isso foi o que eu pude perceber até agora. Sugestão, utilize uma lista encadeada, assim você pode adicionar quantos bois forem necessários e fica um pouco mais fácil descobrir qual é o mais gordo e o mais magro (se você der uma estudada no assunto, é claro). Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Setembro 2, 2009 Apenas complementando o que o José Enésio disse, scanf() retorna o número de argumentos lidos com sucesso. E outra, o seu arquivo de entrada, em uma string seria: bandido\n100.44\nvalente\n87.9 \eof Não tem nada de errado com o seu scanf não??E outra, scanf lê os dados da stream padrão de entrada. Pq você não faz: while (fscanf(file, "%s%*c%f%*c", nome, &peso) == 2 && peso != 0) .... E no arquivo entrada.txt: bandido 100.44 valente 89.7 end 0 Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Setembro 2, 2009 Oq eu ia te falar é, nem se um boi morrer ele vai ser + magro q 0 hein. #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char boi[11],boiG[11],boiM[11]; float peso,gordo,magro; peso = gordo = 0.0; magro = 9999.99; memset(boiG, '\0', 11 * sizeof(char)); memset(boiM, '\0', 11 * sizeof(char)); while(scanf("%s%f", boi, &peso) != EOF){ if(peso<=magro){ magro=peso; strcpy(boiM,boi); } if(peso>=gordo){ gordo=peso; strcpy(boiG,boi); } } printf("Boi Gordo: %s -> Peso: %.2f\n",boiG, gordo); printf("Boi Magro: %s -> Peso: %.2f\n",boiM, magro); return 0; } []s Compartilhar este post Link para o post Compartilhar em outros sites
vhbsouza 0 Denunciar post Postado Setembro 2, 2009 Então, José Enésio, Victor, muito obrigado pelas explicações eu entendi o que vocês disseram. Usando o que vocês disseram eu modifiquei meu codigo e consegui resolver o problema! PS.: Usei o fscanf. Daí fui ler o q o quitZAUMMM posto e gostei da alternativa q ele disse. Eu sabia q a minha ideia de usar o scanf no while não estava errada, porque eu sempre faço isso com os exercicios da BR.SPOJ e nunca dava problema! Fui intender que pra fazer isso com string eu tenho q complementar usando o memset. Valew QuitZAUMMM! Muito Obrigado GALERA! :D Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Setembro 2, 2009 É eu tbm uso essa forma do scanf, pq tbm resolvo problemas do spoj ;D procura lah 'Wilber quitZAUMMM' http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites