Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

guilhoto

passar para uma estrutura uma string separada

Mensagens Recomendadas

guilhoto    1
guilhoto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLINESIZE 1025
#define NUMSEP 9

struct box {
	struct box* next;
	char l[1025];
	int linhaa;
	 char* aux2[1025];//tabela que guarda as palabras da string l
};
struct lista {
	struct box* first;
	struct box* last;	  
};

typedef struct box box;
typedef struct lista lista;
const char separators[] = { ' ','\t',',',';','.','?','!','"','\n' };
void split(char *line){
box* jasus;
int i, j, k,contador=0;
char buffer[MAXLINESIZE];
for(i = 0, k = 0; line[i] != '\0'; i++, k++) {
 buffer[k] = tolower(line[i]);
 for(j = 0; j < NUMSEP; j++) {
  if(line[i] == separators[j]) {
if(k != 0) {
buffer[k] = '\0';
box* jasus=malloc(sizeof(box));
strcpy(jasus->aux2[contador],buffer);
contador++;
}
k = -1;
  }
 }
}
}

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 = malloc(sizeof(*caixa));
 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;
}
void imprimeTexto(box* iter){
while(iter!=NULL){
 printf("%s lista\n",iter->l);
 iter=iter->next;
}
}
int main(void){
int numLinhas,i=0;
box line;
box* cu;
lista* pila;
char aux[1025],ordem;
scanf("%d", &numLinhas);
getchar();
fgets(aux,1025,stdin);
pila=novaLista();
cu=novaBox();	
insereListaVazia(cu,pila);

strcpy(pila->last->l,aux);
line.linhaa=i;
split(pila->last->l);

for(i=1;i<numLinhas;i++){
	 fgets(aux,1025,stdin);
	 cu=novaBox();
	 insereLista(cu,pila);
	 strcpy(pila->last->l,aux);
	 line.linhaa=i;
   }
while(1){
 scanf(" %c", &ordem);
 if (ordem=='s'){
  imprimeTexto(pila->first);
 }
 else if(ordem=='f'){
 }
 else if(ordem=='w'){
 }
 else if (ordem== 'l'){
 }
 else if (ordem=='h'){
 }
 else{
  break;
 }
}
 mataLista(pila);
   return 0;
}

boa noite, o meu objectivo e que na funcao split ele guarde palavra a palavra da string que recebe e que a guarde na estrutura box na tabela que esta indicada.

o que estou a fazer de mal?

Editado por guilhoto

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg
struct box {
               struct box* next;
               char l[1025];
               int linhaa;
                char* aux2[1025];//tabela que guarda as palabras da string l
};

Nesta estrutura, o membro aux2 é um array de ponteiros. Ou seja, cada elemento é um ponteiro.

Em nenhuma parte do código fazes esses ponteiros apontarem para um lugar válido, por isso "o programa explode" ao tentar aceder onde eles (não) apontam.

PS: arranja nomes mais relacionados com o intuito para as tuas variaveis. Um nome óptimo para um objecto que vai conter uma palavra é "palavra"; um nome óptimo para um objecto que vai conter uma lista é "lista"; ...

Por vezes não se pode usar o nome óptimo (por ser, por exemplo, uma palavra chave do C, ou um nome já em uso com outro significado) mas pode-se sempre arranjar um nome bom. O nome "cu" para um objecto que vai conter palavras não é um nome bom!

Editado por 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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
guilhoto    1
guilhoto

desculpa pmg mas as vezes a irritaçao por nao tar a conseguir leva-me a isto :S.

vou mudar...

mas olha eu mudei para isto:

   box* jasus=malloc(sizeof(box));
   jasus->aux2[contador]=buffer;
   printf("%s %s", jasus->aux2[0], jasus->aux2[1]);
   contador++;
   }

o printf meti para testar o que imprimia quando introduzia andre guilhoto

o output foi andre <null> <null> guilhoto

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
guilhoto    1
guilhoto
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLINESIZE 1025
#define NUMSEP 9

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

typedef struct box box;
typedef struct lista lista;
const char separators[] = { ' ','\t',',',';','.','?','!','"','\n' };
void split(char *line){
box** new;
int i, j, k,contador=0;
char buffer[MAXLINESIZE];
for(i = 0, k = 0; line[i] != '\0'; i++, k++) {
 buffer[k] = tolower(line[i]);
 for(j = 0; j < NUMSEP; j++) {
  if(line[i] == separators[j]) {
   if(k != 0) {
   buffer[k] = '\0';
   box* jasus=malloc(sizeof(box));
   jasus->aux2[contador]=buffer;
   printf("%s %s", jasus->aux2[0], jasus->aux2[1]);
   contador++;
   }
   k = -1;
  }
 }
}
}

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 = malloc(sizeof(*caixa));
 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;
}
void imprimeTexto(box* iter){
while(iter!=NULL){
 printf("%s lista\n",iter->l);
 iter=iter->next;
}
}
int main(void){
   int numLinhas,i=0;
   box line;
   box* caixinha;
   lista* listinha;
   char aux[1025],ordem;
   scanf("%d", &numLinhas);
   getchar();
   fgets(aux,1025,stdin);
   listinha=novaLista();
   caixinha=novaBox();	
   insereListaVazia(caixinha,listinha);

   strcpy(listinha->last->l,aux);
   line.linhaa=i;
split(listinha->last->l);

   for(i=1;i<numLinhas;i++){
	 fgets(aux,1025,stdin);
	 caixinha=novaBox();
	 insereLista(caixinha,listinha);
	 strcpy(listinha->last->l,aux);
	 line.linhaa=i;
   }
while(1){
 scanf(" %c", &ordem);
 if (ordem=='s'){
  imprimeTexto(listinha->first);
 }
 else if(ordem=='f'){
 }
 else if(ordem=='w'){
 }
 else if (ordem== 'l'){
 }
 else if (ordem=='h'){
 }
 else{
  break;
 }
}
 mataLista(listinha);
   return 0;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Imprime os aux2, só para debugging do teste :)

   box* jasus=malloc(sizeof(box));
   jasus->aux2[contador]=buffer;

   printf("aux2[0] at %p\n", (void*)jasus->aux2[0]);
   printf("aux2[1] at %p\n", (void*)jasus->aux2[1]);

   printf("%s %s", jasus->aux2[0], jasus->aux2[1]);
   contador++;
   }


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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
guilhoto    1
guilhoto

input: andre guilhoto

output:

aux2[0] at 0018f72b

aux2[1] at 00000000

andre <null>aux2[0] at 0000000

aux2[1] at 0018f72b

<null> guilhoto

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.