Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Shurd

Programa de substituição de strings

Recommended Posts

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.