Jump to content
guilhoto

guardar uma string numa lista duma estrutura

Recommended Posts

guilhoto

boas pessoal

main(){
      int numLinhas,i;
      box* cu;
      lista* pila;
      char aux[1025];
      scanf("%d", &numLinhas);
      getchar();
      fgets(aux,1025,stdin);
      cu=novaBox();
      pila=novaLista();
      insereListaVazia(cu,pila);
      strcpy(pila->last->l,aux);//o erro esta aqui
      printf("%s", cu->l);
      system("pause");

   }

eu gostava de saber o que posso fazer para que consiga passar a string de aux para o l...

passo as estruturas (se precisarem das funcoes digam que ponho tambmem :) )

typedef char linha;
typedef struct box {
       box* next;
       linha* l;
       int linhaa;
} box;
typedef struct lista {
       box* first;
       box* last;       
}lista;

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

l é um ponteiro para char, é impossível guardar uma string num ponteiro


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
guilhoto

happy, mudei para:

main(){
      int numLinhas,i;
      box* cu;
      lista* pila;
      char aux[1025];
      scanf("%d", &numLinhas);
      getchar();
      fgets(aux,1025,stdin);
      pila=novaLista();
      cu=novaBox();    
      insereListaVazia(cu,pila); 
      strcpy(pila->last->l,aux);
      printf("%s\n", pila->last->l);
      system("pause");
      }

typedef struct box {
       box* next;
       char l[1025];
       int linhaa;
} box;
typedef struct lista {
       box* first;
       box* last;       
}lista;

o programa ja imprime bem mas explode a seguir ao printf...

Edited by pmg

Share this post


Link to post
Share on other sites
guilhoto

e o system("pause"); que ta a explodir o programa mas nao estou a perceber o porque...

Share this post


Link to post
Share on other sites
pmg
typedef struct box {
       box* next;

Suponho que estás a usar um compilador de C++.

Se queres aprender C, aconselho-te que uses um compilador de C (ou que configures o teu compilador para C).

Se estás de facto a usar um compilador de C, então olha bem para as mensagens de erro e resolve os erros.

De qualquer maneira (com erros, sem erros, com compilador de C ou C++), aumenta o nível de warnings do teu compilador e faz compilações limpas, sem erros nem warnings.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

estás a dizer que se tirares o system("pause") o programa corre bem ?

altera as definições para :

struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
struct lista {
 struct box* first;
 struct box* last;       
};

typedef struct box box;
typedef struct lista lista;
// prefiro esta porque o código e torna mais claro (dentro do âmbito dos typedefs)

ou

typedef struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
typedef struct lista {
 box* first;
 box* last;       
};


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que esta de errado ai pmg?

typedef struct box {
       box* next; // <--- o tipo de dados "box" não se encontra ainda definido


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

Em C, o typedef só introduz o novo nome para o tipo que define depois do ponto-e-virgula (;).

/* novo_nome nao existe */
typedef /* novo_nome nao existe */ <tipo> /* novo_nome nao existe */ <novo_nome>;
/* novo_nome agora já existe */

Eu não sei bem as regras de C++, mas, aparentemente, o teu código compila sem erro, por isso as regras de C++ devem contemplar a situação e compilar o código errado em C.

Ao fazeres

typedef struct box {
       box* next;
       /* ... */
} box;

o tipo box não existe dentro da definição da struct box.

Excepto em casos particulares (como definição de tipos de funções) eu acho que o typedef causa mais danos que beneficios.

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
guilhoto

struct box {
       struct box* next;
       char l[1025];
       int linhaa;
};
struct lista {
       struct box* first;
       struct box* last;       
};
typedef struct box box;
typedef struct lista lista;

deixando assim penso que estara mais correcto :) ?

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Excepto em casos particulares (como definição de tipos de funções) eu acho que o typedef causa mais danos que beneficios.

existe um caso em o typedef é mais do que útil, é obrigatório : dados abstractos

//-------------
// stack.h
//-------------
typedef struct Stack Stack

Stack * stack_create();

int stack_destroy(Stack ** stack);

int stack_quantity(Stack * stack, size_t * quantity);

int stack_push(Stack * stack, void * elem);

void * stack_pop(Stack * stack);

int stack_clear(Stack * stack);

//-------------
// stack.c
//-------------
struct StackElem {
 struct StackElem * prev;
 void * elem;
}

struct Stack {
 size_t quantity;
 struct StackElem * top;
}

// implementação das funções ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

se tiveres Windows e só programares para Windows, o Visual Studio. eu não uso mas sei dar a mão à palmatória.

caso contrário, Netbeans ou Eclipse são excelentes IDE's mas tenho vindo a ouvir que é demasiado complexo para iniciantes.

Ouvi dizer que o Geany ou o CodeBlocks é bom para iniciantes

ps : o @psweo referenciou num outro tópico recentemente que o Pelles C também será uma boa opção

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
guilhoto

estou a usar o pelles C mas estou a ter uns warnings que penso ser da configuraçao...podes me passar o link desse topico ou dizer onde posso procurar sff :) ?

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz copy-paste dos warnings para aqui

(e todo o código também daria jeito)

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
guilhoto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAXLINESIZE 1025
struct box {
 struct box* next;
 char l[1025];
 int linhaa;
};
struct lista {
 struct box* first;
 struct box* last;	
};
typedef struct box box;
typedef struct lista lista;
lista* novaLista(void) {
 lista* list = (lista*)malloc(sizeof(lista));
 list->first = NULL;
 list->last = NULL;
 return list;
}
void mataLista(lista* list) {
 free(list);
}
box* novaBox(void){
 box* caixa = (box*)malloc(sizeof(lista));

 caixa->next = NULL;	
 return caixa;
}
void insereListaVazia(box* caixa, lista* list) {
 list->first = caixa;
 list->last = caixa;
}
void insereLista(box* caixa, lista* list) {
 list->last->next = caixa;
 list->last = caixa;
}
int main(void){
 int numLinhas,i=0;
 box line;
 box* cu;
 lista* pila;
 char aux[1025];
 scanf("%d", &numLinhas);
 getchar();
 fgets(aux,1025,stdin);
 pila=novaLista();
 cu=novaBox();	
 insereListaVazia(cu,pila);
 strcpy(pila->last->l,aux);
 line.linhaa=i;

 for(i=1;i<numLinhas;i++){
		 fgets(aux,1025,stdin);
		 cu=novaBox();
		 insereLista(cu,pila);
		 strcpy(pila->last->l,aux);
		 line.linhaa=i;
 }
//para imprimir todas as strings introduzidas como devo fazer?
}
mataLista(pila);
 return 0;
}

warning #2203: Function 'main' can't be __stdcall, changed to __cdecl.

ja agora como e que posso imprimir todas as strings armazenadas? duvido que as esteja a armanezar correctamente...

basicamente o utilizador introduz o numero de strings que vai meter, e eu quero guardar cada string numa box

Edited by guilhoto

Share this post


Link to post
Share on other sites
pmg

existe um caso em o typedef é mais do que útil, é obrigatório : dados abstractos

Não concordo.

Repara que, no ficheiro header, só tens pointers (para pointers) para struct Stack

//-------------
// stack.h
//-------------
struct Stack *stack_create();

int stack_destroy(struct Stack **stack);

int stack_quantity(struct Stack *stack, size_t *quantity);

int stack_push(struct Stack *stack, void * elem);

void *stack_pop(struct Stack *stack);

int stack_clear(struct Stack *stack);

//-------------
// stack.c
//-------------
struct StackElem {
 struct StackElem * prev;
 void * elem;
};

struct Stack {
 size_t quantity;
 struct StackElem * top;
};

// implementação das funções ...

PS: não te esqueças dos ponto-e-virgulas :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

warning #2203: Function 'main' can't be __stdcall, changed to __cdecl.

estás a tentar compilar uma aplicação Win32.

deverias ter criado um projecto para consola

ja agora como e que posso imprimir todas as strings armazenadas? duvido que as esteja a armanezar correctamente...

basicamente o utilizador introduz o numero de strings que vai meter, e eu quero guardar cada string numa box

se estás a gravar correctamente, verás depois de tentar imprimir todas as string armazenadas

box * iter = lista->first;
while (iter != NULL) {
 printf("%s\n", iter->l);
 iter = iter->next;
}

Não concordo.

Repara que, no ficheiro header, só tens pointers (para pointers) para struct Stack

mas conheces outra maneira de ter ADT's minimamente seguros do programador ?

PS: não te esqueças dos ponto-e-virgulas :)

pois ... mas para isso tenho os warnings/erros do compilador :D


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

mas conheces outra maneira de ter ADT's minimamente seguros do programador ?

O que fizeste está correcto, mas o typedef não é necessário.

Só que em vez de escreveres Stack * escreves struct Stack * e não usas o typedef.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
guilhoto

sim mas isso compila e executa :) . depois mudo isso.

box * iter = pila->first;
while (iter != NULL) {
 printf("%s\n", iter->l);
 iter = iter->next;
}

assim nao e :) ?

eu introduzi:

andre guilhoto

pedro grilo

output:

andre gu(um losangolo)

pedro grilo

penso que estou perto...talvez seja por nao limpar o aux?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.