Ir para conteúdo

POWERED BY:

Arquivado

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

vhbsouza

[Resolvido] Problema com estouro de caracteres

Recommended Posts

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.