Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

guilhoto

passar para uma estrutura uma string separada

Recommended Posts

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?

Edited by guilhoto

Share this post


Link to post
Share on other sites
HappyHippyHippo

não foi a ti que apresentei um código de split no outro tópico ?


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

Share this post


Link to post
Share on other sites
guilhoto

sim mas o codigo de split esta bem...ele faz o split, so que nao esta a guardar...o programa explode...

Share this post


Link to post
Share on other sites
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!

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

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

apresenta o código que tens agora

(e tenda dar uma indentação melhor ...)


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

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
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

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

×

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.