Struct em C [RESOLVIDO]

1. Struct em C [RESOLVIDO]

Jeferson
Jefferson21

(usa Ubuntu)

Enviado em 18/03/2013 - 13:39h

Boa tarde programadores ....

Estou com uma duvida aparentemente simples, porem eu não estou conseguindo resolver.
Tenho esse codigo abaixo, que gostaria de implementar de outra forma,
Como vocês estão vendo, ele ja esta preenchido, eu gostaria de fazer com que o usuario fizesse isso.

Como eu posso fazer com que o usuario preencha essa estrutura?
Como ficaria o scanf?

Me ajudem por favor!!



typedef struct {
const char * name;
int weight, value;
} item_t;

item_t item[] = {
{"84237", 8366, 1},
{"89237", 8384, 1},
{"89681", 7852, 1},
{"84529", 8384, 1},
{"89872", 8812, 1},
{"89866", 7796, 1},
{"86260", 8414, 1},


};




  


2. Re: Struct em C [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 18/03/2013 - 14:21h

Poem um laço for para guardar os valores lidos pelo scanf direto no indice:


for ( i = 0 ; i < ((sizeof(item)/sizeof(item[0])) ; i++ )
{
puts("Nome:");
scanf("%s", &(item[i].name));

puts("Peso:");
scanf("%d", &(item[i].weight));
}



3. Re: Struct em C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/03/2013 - 00:41h

Na verdade, o código acima é só o começo das alterações que têm de ser feitas.

No que o campo name está declarado como um ponteiro para caracteres constantes. Sendo contantes, não podem ser alterados. Logo, o tipo do campo deve ser alterado.

Mas não basta remover a palavra-chave const: um ponteiro guarda apenas o endereço de onde está o dado, mas não abre espaço para esse(s) dado(s).

A melhor forma de fazer depende de o que se vai fazer com os dados depois de lidos. Usar alocação dinâmica é uma possibilidade, mas tornaria mais difícil uma aplicação que quisesse escrever e ler registros de tamanho fixo em disco, por exemplo. Por outro lado, trocar os ponteiros por arrays de caracteres com um tamanho arbitrário traz o dilema de definir qual o melhor tamanho para cada array, de modo a evitar desperdício de memória mas também não ser pequeno demais para armazenar um eventual dado válido com nome mais comprido.


4. Re: Struct em C [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/03/2013 - 03:17h

Como sempre chego atrasado e todo mundo já respondeu com clareza, mas especifica o tamanho do array, tire o const.
Com scanf irá fazer mesmo método scanf & e o caminho do endereço
"scanf("%tipo",&var deacesso[contagem].membro").



5. Re: Struct em C [RESOLVIDO]

Jeferson
Jefferson21

(usa Ubuntu)

Enviado em 19/03/2013 - 08:34h

Programadores Muito obrigado pela ajuda eu vou tentar matar esse leão, qualquer coisa volto aqui .. :)


6. Re: Struct em C [RESOLVIDO]

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 19/03/2013 - 09:02h

O Paulo está correto com a afirmação feita.

Eu passei o modo mais simples, utilizando um vetor estático, com tamanho já definido.

Ele é mais fácil de ser utilizado, mas se paga com memória desperdiçada, um vez que não ocupe todos os índices alocados, mas também em determinada situação pode faltar posições pois o vetor já estará cheio.

Quanto ao nome, comentado também pelo Paulo, pode utilizar funções como malloc ou calloc para armazenar o tamanho necessário para guardar na estrutura, porém não se esqueça que sempre que for necessário utilizar o scanf, também irá necessitar de uma string já alocada para armazenar.

Uma dica simples seria utilizar um buffer auxiliar para armazenar o nome e depois alocar o tamanho na estrutura como:


char buffer [128];


for ( i = 0 ; i < ((sizeof(item)/sizeof(item[0])) ; i++ )
{
puts("Nome:");
scanf( "%s", &buffer );

//Verifica se o usuário digitou algo
if( strlen(buffer) )
{
/* Aqui aloca o tamanho necessário + 1. Esse +1 byte é para colocar um NUL no final e servir como batente */
item[i].name = (char *) malloc( strlen(buffer) + 1 );
//Conseguiu alocar?
if ( item[i].name != (char *) NULL )
{
//Limpa o destino
memset( item[i].name, 0, sizeof(item[i].name) );
//Copia o conteúdo do buffer auxiliar para o destino
memcpy( item[i].name, buffer, strlen(buffer) );
}
else
//Erro na alocação
perror("Malloc");
}

puts("Peso:");
scanf("%d", &(item[i].weight));
}








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts