Shurd 0 Denunciar post Postado Outubro 29, 2011 Olá pessoal, sou novo no fórum venho programando desde o semestre passado e travei num problema, que para algum de voces possa até ser simples. O programa: Possuo um arquivo escrito da seguinte forma: <tag_palavra_antiga_inicio> ola <tag_palavra_antiga_final> <tag_palavra_nova_inicio> tudo <tag_palavra_nova_final> <tag_palavra_antiga_inicio> camarada <tag_palavra_antiga_final> <tag_palavra_nova_inicio> bem <tag_palavra_nova_final> E um segundo arquivo da seguinte forma: ola camarada O programa devera substituir a palavra ola por tudo e camarada por bem e escrever a nova frase na tela e num novo arquivo. De modo que fique "tudo bem" no outro arquivo. Pois bem, eu consigo fazer ele achar a palavra ola e a palavra tudo, e substitui-las, porém não consigo achar as outras palavras para fazer a substituição. O codigo que encontra as palavras é o seguinte: (Não postarei o codigo de substituição de strings, pois sei que ele esta funcionando corretamente) //Faz a passagem do conteudo do arquivo para a memoria----------------------------------------------------------- fread(target,1,sizetarget,ftarget); target[strlen(target)] = '\0'; printf("\t---target---\n%s\n",target); printf("\t------------\n"); //Checa se o numero de tags batem para rodar o programa corretamente--------------------------------------------- if((procura(target,TGPI))!=(procura(target,TGSI))||(procura(target,TGPE)!=procura(target,TGSE))) { printf("\n\t---Formatacao do arquivo target incorreta\n---\t---%s---\n",ESC); getchar(); return -1; } //Procura a primeira ocorrencia da tag de inicio e da tag de final da palavra a ser procurada-------------------- [b]Seria necessario fazer um loop desta parte até a proxima parte em negrito, porém não sei como o loop pode ser feito, ja que a função strstr acha a primeira aparição de um string numa outra[/b] ptag1 = strstr(target,TGPI); ptag1 += strlen(TGPI)+1; ptag2 = strstr(target,TGPE); ptag2 -= 1; //Checa se foi possivel alocar a memoria, caso positivo continua o programa-------------------------------------- pantiga = (char *) calloc(ptag2-ptag1,sizeof(char)); if(pantiga==NULL) { printf("\t---Nao foi possivel alocar a memoria---\n"); return -1; } //Copia a frase entre as tags para a memoria--------------------------------------------------------------------- strncpy(pantiga,ptag1,ptag2-ptag1); pantiga[ptag2-ptag1] = '\0'; printf("\n\t---Palavra antiga---\n\t%s\n",pantiga); printf("\t------------\n"); //Procura a primeira ocorrencia da tag de inicio e da tag de final da palavra a ser substituida------------------ ptag1 = strstr(target,TGSI); ptag1 += strlen(TGSI)+1; ptag2 = strstr(target,TGSE); ptag2 -= 1; //Checa se foi possivel alocar a memoria, caso positivo continua o programa-------------------------------------- pnova = (char *) calloc(ptag2-ptag1,sizeof(char)); if(pnova==NULL) { printf("\t---Nao foi possivel alocar a memoria---\n"); return -1; } //Copia a frase entre as tags para a memoria--------------------------------------------------------------------- strncpy(pnova,ptag1,ptag2-ptag1); pnova[ptag2-ptag1] = '\0'; printf("\t---Palavra Nova---\n\t%s\n",pnova); printf("\t------------\n"); [b]FIM DO LOOP[/b] Obs: TGPI vale "<tag_palavra_antiga_inicio>" TGPE vale "<tag_palavra_antiga_final>" TGSI vale "<tag_palavra_nova_inicio>" TGSE vale "<tag_palavra_nova_final>" Obrigado desde já para quem possa e quiser ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
Shurd 0 Denunciar post Postado Outubro 30, 2011 Bom, imagino que ninguém tenha conseguido, ou os que olharam acharam grande demais e preferiram não fazer. De qualquer jeito, consegui resolver, caso alguém queria saber como fiz poste e eu colocarei o código num próximo post. Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Outubro 30, 2011 Acho que poderia postar para nós a solução. Não acha que é meio tenso mandar um código todo confuso, aos pedaços e falar que em um dia nós não conseguimos porque ou não tentamos (ficamos com preguiça, ficou grande demais) ou porque não conseguiu. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Shurd 0 Denunciar post Postado Outubro 30, 2011 Acho que poderia postar para nós a solução. Não acha que é meio tenso mandar um código todo confuso, aos pedaços e falar que em um dia nós não conseguimos porque ou não tentamos (ficamos com preguiça, ficou grande demais) ou porque não conseguiu. Abraços :D Ah, esta comentado o que cada parte faz, desculpe caso tenho ofendido alguem. Aqui esta a solução: while(mtarget[0]!='\0') { //Procura a ocorrencia da tag de inicio e da tag de final da palavra a ser procurada----------------------------- fimb = mtarget; fimb += strlen(mtarget); ptag1 = strstr(mtarget,TGPI); ptag1 += strlen(TGPI)+1; ptag2 = strstr(mtarget,TGPE); ptag2 -= 1; //Checa se foi possivel alocar a memoria, caso positivo continua o programa-------------------------------------- pantiga = (char *) calloc(ptag2-ptag1+1,sizeof(char)); if(pantiga==NULL) { printf("\t---Nao foi possivel alocar a memoria para a palavra antiga---\n"); return -1; } //Copia a frase entre as tags para a memoria--------------------------------------------------------------------- strncpy(pantiga,ptag1,ptag2-ptag1); pantiga[ptag2-ptag1] = '\0'; //printf("\n\t---Palavra antiga---\n\t%s\n",pantiga); //mostra as modificacoes da palavra antiga //printf("\t------------\n"); //Procura a ocorrencia da tag de inicio e da tag de final da palavra a ser substituida--------------------------- ptag1 = strstr(mtarget,TGSI); ptag1 += strlen(TGSI)+1; ptag2 = strstr(mtarget,TGSE); iniciob = ptag2; iniciob += strlen(TGSE); ptag2 -= 1; //Checa se foi possivel alocar a memoria, caso positivo continua o programa-------------------------------------- pnova = (char *) calloc(ptag2-ptag1+1,sizeof(char)); if(pnova==NULL) { printf("\t---Nao foi possivel alocar a memoria para a palavra nova---\n"); return -1; } //Copia a frase entre as tags para a memoria--------------------------------------------------------------------- strncpy(pnova,ptag1,ptag2-ptag1); pnova[ptag2-ptag1] = '\0'; //printf("\t---Palavra Nova---\n\t%s\n",pnova); //mostra as modificacoes da palavra nova //printf("\t------------\n"); //Substitui a palavra antiga pela nova--------------------------------------------------------------------------- msource = substitui(msource,pantiga,pnova); //printf("\n\t%s\n",msource); //mostra as modificacoes de msource //Copia o que falta substituir para recomecar o loop strncpy(mtarget,iniciob+1,fimb-iniciob); mtarget[fimb-iniciob] = '\0'; iniciastring(&ptag1); iniciastring(&ptag2); iniciastring(&iniciob); iniciastring(&fimb); //printf("\n\t---New Target---\n%s\n",mtarget); //mostra as modificacoes de target //printf("\t----------------\n"); novastr=msource; } Funciona da seguinte forma, marca-se o fim como o fim do arquivo e inicio como a primeira occorencia da tag de procura. Apois isso faz a substituicao das palavras encontradas(de pantiga por pnova no texto msouce), copia-se o que falta para mtarget e refaz o loop. Compartilhar este post Link para o post Compartilhar em outros sites