Ir ao conteúdo
  • Cadastre-se

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;
}

 

 

Link para o comentário
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

Link para o comentário
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.

 

 

Link para o comentário
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?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...