converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

1. converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Daniel
danielcrvg

(usa Slackware)

Enviado em 27/12/2014 - 13:15h

Ola pessoal..


to tentando converter os dados de uma struct em um vetor unico:


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

struct Test{
char *nome;
int x;
int y;
};

int main(){

struct Test t01;
t01.nome="daniell";
t01.x=5;
t01.y=9;

char c = t01.x + '0';
char d = t01.y + '0';

unsigned int tam = strlen(t01.nome)+sizeof(t01.x)+sizeof(t01.y)+1;
printf("tam: %u\n",tam);

char test[tam];

printf("len test: %zu\n",sizeof(test));

test[strlen(test)] = c;
test[strlen(test)] = d;
strcat(test,t01.nome);
printf("%s\n",test);
printf("%d\n",strlen(test));

return 0;
}



So que se eu aumento o conteudo dessa variavel aqui: t01.nome="daniell"; ja aparece um monte de lixo..

eu tentei alocar dinamicamente a memoria pro tamannho do meu array q vai receber tudo mas nao deu certo.. por isso eu resolvi somar os tamanhos aqui:

unsigned int tam = strlen(t01.nome)+sizeof(t01.x)+sizeof(t01.y)+1;

e depois definir o tamanho do vetor[tam] ...


q q eu to fazendo de errado??

obrigado,





  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/12/2014 - 00:04h

Acima eu disse o mais simples. Agora deixe eu mostrar o problema no seu programa.

Quando você fez

char test[tam]; 


, qual você imagina ser o conteúdo inicial do array test? O que você imagina que strlen() vai retornar, dado esse conteúdo?

3. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

thiago henrique
thiago211

(usa openSUSE)

Enviado em 27/12/2014 - 17:14h

danielcrvg escreveu:

Ola pessoal..


to tentando converter os dados de uma struct em um vetor unico:


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

struct Test{
char *nome;
int x;
int y;
};

int main(){

struct Test t01;
t01.nome="daniell";
t01.x=5;
t01.y=9;

char c = t01.x + '0';
char d = t01.y + '0';

unsigned int tam = strlen(t01.nome)+sizeof(t01.x)+sizeof(t01.y)+1;
printf("tam: %u\n",tam);

char test[tam];

printf("len test: %zu\n",sizeof(test));

test[strlen(test)] = c;
test[strlen(test)] = d;
strcat(test,t01.nome);
printf("%s\n",test);
printf("%d\n",strlen(test));

return 0;
}



So que se eu aumento o conteudo dessa variavel aqui: t01.nome="daniell"; ja aparece um monte de lixo..

eu tentei alocar dinamicamente a memoria pro tamannho do meu array q vai receber tudo mas nao deu certo.. por isso eu r


Ola amigo ...entao,

Acredito que nao tem como converter struct em vetor .

Vetores armazenam apenas um tipo de dados ou int ,ou char ,ou float etc .

Ja structs tem a possibilidade de armazenar mais de um tipo de dados ,int ,char ,float ,struct etc.

No caso do nome que retorna um lixo quando voce tenta armazenar mais caracteres ...

tente dessa forma abaixo :

...
struct test{

...

char nome[100];

...

};


Assim voce armazenara 100bytes no array de caracteres nome ,dessa forma voce ira consegui digitar 100 caracteres .

Bom acho que e isso .

Se eu estiver errado ,alguem me corrigira

Ate mais :) ...



4. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Daniel
danielcrvg

(usa Slackware)

Enviado em 27/12/2014 - 17:40h

sim sim.. vc ta certo o vetor so armazena 1 tipo de dado..

ai eu converti os int's assim:

char c = t01.x + '0';
char d = t01.y + '0';

pra poder concatenar no vetor..






5. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/12/2014 - 23:51h

Acho que a maneira mais simples (e portável) de fazer o que você quer é com snprintf() (não se guie só pelo exemplo: leia a documentação!!).

int len;
char *str;

/* Primeiro, uma rodada sem gravar, só para ver o tamanho. */
len=1+snprintf(NULL, 0, "%s%d%d\n", t01.nome, t01.x, t01.y);

/* Aloca os caracteres contados acima (mais byte nulo). */
if((str=malloc(len))==NULL){
perror("malloc()");
exit(1);
}

/* Agora, sim, preenche o conteúdo. */
snprintf(str, len, "%s%d%d", t01.nome, t01.x, t01.y);

/* ... Usa str. ... */

/* Libera str. */
free(str);


Se estiver usando um compilador que tenha suporte (como os da GNU, por exemplo), existe uma função asprintf, que faz a alocação necessária e preenche o conteúdo.

char *str;

if(asprintf(&str, "%s%d%d", t01.nome, t01.x, t01.y)==-1){
perror("asprintf()");
exit(1);
}

/* ... Usa str. ... */

/* Libera str. */
free(str);



6. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Daniel
danielcrvg

(usa Slackware)

Enviado em 28/12/2014 - 00:42h

paulo1205 escreveu:

Acima eu disse o mais simples. Agora deixe eu mostrar o problema no seu programa.

Quando você fez

char test[tam]; 


, qual você imagina ser o conteúdo inicial do array test? O que você imagina que strlen() vai retornar, dado esse conteúdo?


Opa boa noite!!

entao.. eu deixei ele sem inicializacao pq tava dando erro quando eu inicializava ele.. tipo dizendo que quando eu defino o tamanho eu nao posso inicializar.. algo assim

ai eu pensei em somar o tamanho de todas as variaveis da estrutura, e depois apenas setar o tamanho do vetor passando a variavel..

Mesmo ele estando vazio, eu imaginei ja estar reservando um bloco de tamanho 'tam' para eu depois concatenar os dados la dentro..




7. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/12/2014 - 02:52h

Você não respondeu exatamente, mas falou em "mesmo ele estando vazio".

Esse é o problema: quem disse que está vazio? O conteúdo inicial é indeterminado, pode haver qualquer coisa.

Se você o quer vazio (imagino que você queria dizer "com todos os bytes nulos"), deve explicitamente fazê-lo ser assim. Por exemplo:

char test[size];
memset(test, 0, size);




EM TEMPO: Eu acho que você se beneficiaria muito usando C++ e lugar de C.


8. Re: converter struct em um vetor.. acumulando lixo. [RESOLVIDO]

Daniel
danielcrvg

(usa Slackware)

Enviado em 28/12/2014 - 08:25h

paulo1205 escreveu:

Você não respondeu exatamente, mas falou em "mesmo ele estando vazio".

Esse é o problema: quem disse que está vazio? O conteúdo inicial é indeterminado, pode haver qualquer coisa.

Se você o quer vazio (imagino que você queria dizer "com todos os bytes nulos"), deve explicitamente fazê-lo ser assim. Por exemplo:

char test[size];
memset(test, 0, size);




EM TEMPO: Eu acho que você se beneficiaria muito usando C++ e lugar de C.



vc tem razao, nao é pq que nao inicializei que significa que ele esteja vazio..

eu quero apreender C..

perdi uma boa oportunidade de trabalhar com C/C++.. a vaga seria para programar em C/C++, ai eu apenas estudei o C++ e chego na hora do teste so pediram materia referente a C e absolutamente NADA de C++...resumindo.. me fudi!

ate conheco outras linguagens, com bibliotecas e frameworks ja prontos, mas eu nao quero trabalhar com elas.

quero trabalhar com C ou C++

mas voltando ao assunto do codigo, deu certo.. foi so zerar o resto do vetor com o memset que agora ta funcionando..

se tiver algum material ai (livros, etc) pra me indicar pra estudar eu agradeco, vejo que vc tem muito conhecimento da linguagem..

abraco






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts