Ir ao conteúdo
  • Cadastre-se
Mariana Suniga

C Ponteiro de struct só imprime a primeira letra da variável

Posts recomendados

Alguém consegue me ajudar...

Preciso fazer uma lista com uma struct e não consigo imprimir o conteúdo de uma das variáveis da struct.

Se eu uso o astersíco... só aparece a primeira letra, se deixo sem asterísco dá erro.

Não consigo descobrir o q estou fazendo de errado.

 

#include <stdio.h>
#include <stdlib.h>

typedef struct tAtleta
{
    char nome[100];
    int min;
    int seg;
    int dec;
    int raia;
    int serie;
} tAtleta;

typedef struct tLista
{
    tAtleta *atleta;
    int qtd;
    int tam;
} tLista;

void inicia_lista(tLista *, int);
void insere(tLista *, int, tAtleta *);
int busca_posicao(tLista *, tAtleta *);

int main ()
{
    int raias, i, n, pos;
    tAtleta *atleta;
    tLista *l;

    l = malloc(sizeof(tLista));
    atleta = malloc(sizeof(tAtleta));

    scanf("%d %d", &raias, &n);

    inicia_lista(l, n);

    for (i = 0; i < n; i++)
    {
        scanf("%s %d %d %d", atleta->nome, &atleta->min, &atleta->seg, &atleta->dec);

        insere(l, i, atleta);

        printf("%d ", l->qtd);
        printf("%s %d %d %d", l->atleta->nome, l->atleta->min, l->atleta->seg, l->atleta->dec);
    }

    printf("\n");

    return 0;
}

void insere(tLista *l, int i, tAtleta *t)
{
    *l->atleta[i].nome = *t->nome;
    l->atleta[i].min = t->min;
    l->atleta[i].seg = t->seg;
    l->atleta[i].dec = t->dec;
}

void inicia_lista(tLista *l , int n)
{
    l->atleta = calloc(n, sizeof(tAtleta));
    l->qtd = 0;
    l->tam = n;
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente porque a printf nao lida com strings e outros tipos, pois %s é uma forma especial de imprimir um vetor sem ter que percorrer explicitamente por cada posição de memoria, entao se voce chamar a printf apenas com a variável atleta->nome, ela deve funcionar como deveria

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ja0 Mas eu preciso que exiba da lista... porque vou mostrar os valores depois quando a lista estiver toda preenchida... já vou ter perdido a referência da variável q eu criei para gravar os valores

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, Mariana Suniga disse:

@ja0 Mas eu preciso que exiba da lista... porque vou mostrar os valores depois quando a lista estiver toda preenchida... já vou ter perdido a referência da variável q eu criei para gravar os valores

 

as referencias deverão estar no vetor de structs tAtleta que está dentro da tLista, entao voce pode acessar qualquer elemento do vetor usando o índice do vetor, como l->atleta[ i ].nome por exemplo.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
33 minutos atrás, Mariana Suniga disse:

Mas eu preciso que exiba da lista... porque vou mostrar os valores depois quando a lista estiver toda preenchida... já vou ter perdido a referência da variável q eu criei para gravar os valores

 

Já perdeu a referência na verdade... Ficou lá dentro da função que inicia a lista porque você não retornou o endereço nem passou o endereço do ponteiro... Recomendo muito ler essa discussão sobre o mesmo assunto: 


Onde tem uns dados e um código de exemplo que funciona, com os resultados eu acho

 

Compare
 

typedef struct tLista
{
    tAtleta *atleta;
    int qtd;
    int tam;
} tLista;

void inicia_lista(tLista *, int);
void insere(tLista *, int, tAtleta *);
int busca_posicao(tLista *, tAtleta *);

Com algo assim

    struct tAtleta
    {
        char nome[100];
        int min;  int seg; int dec;
        int raia; int serie;
    };
    typedef struct tAtleta Atleta;

    struct tLista
    {
        struct tLista* atleta;
        int qtd;
    };
    typedef struct tLista Lista;

    int busca_posicao(Lista* equipe, Atleta* um);
    Lista* inicia_lista(Lista* equipe);
    Lista* insere(Atleta* um, Lista* equipe);

    Lista* Equipe;
    Equipe = inicia_lista(Equipe);
    Atleta Johnny;
    strcpy(Johnny.nome, "Johnny Cash");
    Johnny.min = 1;
    Johnny.seg = 2;
    Johnny.dec = 3;
    Johnny.raia = 4;
    Johnny.serie = 5;

    Equipe = insere(&Johnny, Equipe);

Note as diferenças entre seu código e esse exemplo:

  • tem uma estrutura Atleta e uma estrututra Lista, mais fácil de ler
  • As rotinas que manipulam as listas devolvem o ponteiro atualizado. E trabalham apenas com endereços. É importante.
  • É útil ter o tamanho da lista na estrutura, mas o tamanho N em geral não existe. Em geral ao inserir é criado um nó da lista a cada vez, contendo o dado a ser inserido. E é exatamente por isso que as listas são tão úteis. Tem sempre o tamanho certo.

 

adicionado 8 minutos depois

🤔

Talvez não esteja tentando usar uma lista encadeada e sim uma lista simples de tamanho fixo alocada dinâmicamente... É isso? Tem um enunciado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!