Jump to content
José Ol'Ivar

Não consigo encontrar bug em código C

Recommended Posts

José Ol'Ivar

E aí todos? Como vão? Sou novo tanto no fórum quanto no mundo da programação em C.

Escrevi um programinha simples, que traz um recurso que permite ao usuário substituir uma sub-cadeia de um texto por outra cadeia de caracteres.

Tudo corre bem no mais das vezes; porém quando, por exemplo, dou uma entrada como "Y YY", e quero substituir "YY" por, digamos, "OOO", o resultado é "OOO" e não "Y OOO" como seria esperado.

Se alguém puder me ajudar, agradeço desde já!

Segue abaixo o código:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

main()
 {
    char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000];
    char* pt;
    int i, j;

    while(1)
    {
       printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin);

       if(strcmp(TextInic, "0") == 0)
          break;

       printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin);

       if(pt = strstr(TextInic, SubTextExcl))
       {
          printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin);

          i = 0;

          while(TextInic != *pt)
          {
             TextFin = TextInic;
             i++;
          }

          j = 0;
          while(SubTextIncl[j])
             TextFin[i++] = SubTextIncl[j++];

          for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); TextInic[j] != '\0'; i++, j++)
             TextFin = TextInic[j];
          TextFin = '\0';

          printf("\n\n O texto ficou assim: %s", TextFin);
       }
       else
          printf("\n O subtexto a ser excluido nao esta contido no texto.\n");
    }
    printf("\n\nFIM DO PROGRAMA");
 } 

   
         

 

Edited by pwseo
Bloco de código

Share this post


Link to post
Share on other sites
José Ol'Ivar

 Código exato:

 #include <stdio.h>
 #include <conio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>

 main()
 {
    char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000];
    char* pt;
    int i, j;

    while(1)
    {
       printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin);

       if(strcmp(TextInic, "0") == 0)
          break;

       printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin);

       if(pt = strstr(TextInic, SubTextExcl))
       {
          printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin);

          i = 0;
          while(TextInic != *pt)
          {
             TextFin = TextInic;
             i++;
          }

          j = 0;
          while(SubTextIncl[j])
             TextFin[i++] = SubTextIncl[j++];

          for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); TextInic[j] != '\0'; i++, j++)
             TextFin = TextInic[j];
          TextFin = '\0';

          printf("\n\n O texto ficou assim: %s", TextFin);
       }
       else
          printf("\n O subtexto a ser excluido nao esta contido no texto.\n");
    }
    printf("\n\nFIM DO PROGRAMA");
 } 

 

Edited by pwseo
Bloco de código

Share this post


Link to post
Share on other sites
José Ol'Ivar

Hei pessoal, agradecido pela atenção, já descobri o bug. Mero erro nesta linha aqui: "while(TextInic != *pt)". Desculpem a precipitação.

Segue o código, agora corrigido:

 #include <stdio.h>
 #include <conio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>

 main()
 {
    char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000];
    char* pt;
    int i, j;

    while(1)
    {
       printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin);

       if(strcmp(TextInic, "0") == 0)
          break;

       printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin);

       if(pt = strstr(TextInic, SubTextExcl))
       {
          printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin);

          i = 0;
          while(&TextInic != pt)
          {
             TextFin = TextInic;
             i++;
          }

          j = 0;
          while(SubTextIncl[j])
             TextFin[i++] = SubTextIncl[j++];

          for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++)
             TextFin = TextInic[j];

          printf("\n\n O texto ficou assim: %s", TextFin);
       }
       else
          printf("\n O subtexto a ser excluido nao esta contido no texto.\n");
    }
    printf("\n\nFIM DO PROGRAMA");
 } 


 

Edited by pwseo
Bloco de código

Share this post


Link to post
Share on other sites
HappyHippyHippo

a sério ? existem coisas ai muito estranhas que deveriam fazer que não, sendo a mais clara : TextFin = TextInic[j]. atribuir um caracter a um array ?

nota que ao ver esse tipo de problema nem verifiquei os problemas normais de cópia de strings para "dentro" de outras


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

Share this post


Link to post
Share on other sites
José Ol'Ivar

De fato, você tem razão. Não sei o que aconteceu, mas ao colar o código na postagem como que sumiu as variáveis incrementais e respectivos colchetes. Agora que percebi isso.

Share this post


Link to post
Share on other sites
José Ol'Ivar
 #include <stdio.h>
 #include <conio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>

 main()
 {
    char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000];
    char* pt;
    int i, j;

    while(1)
    {
       printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin);

       if(strcmp(TextInic, "0") == 0)
          break;

       printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin);

       if(pt = strstr(TextInic, SubTextExcl))
       {
          printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin);

          i = 0;
          while(&TextInic[i] != pt)
          {
             TextFin[i] = TextInic[i];
             i++;
          }

          j = 0;
          while(SubTextIncl[j])
             TextFin[i++] = SubTextIncl[j++];

          for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++)
             TextFin[i] = TextInic[j];

          printf("\n\n O texto ficou assim: %s", TextFin);
       }
       else
          printf("\n O subtexto a ser excluido nao esta contido no texto.\n");
    }
    printf("\n\nFIM DO PROGRAMA");
 }

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

ja tentaste alterar a string : "123 AA 123 AA 123" e pesquisar a substring "AA" e alterar por "CCC" ?


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

Share this post


Link to post
Share on other sites
José Ol'Ivar

Você tem razão nesse questionamento, mas tal complicação já estava prevista quando fiz o programinha, ficando, por assim dizer, a cargo do usuário sanar eventuais dificuldades quejandas. Por ex., para alterar a segunda substring "AA" na string por você dada, o usuário deveria pesquisar por " 123 AA" e substituir isso por " 123 CCC". Claro que casos como substituir o terceiro '1' de "111" por '0', isto é, "111" para "110", a pesquisa acaba tendo de usar a string inicial inteira.

Seja como for, segue um código que penso resolva isso a contento. Caso tenha alternativa melhor, por favor, aponte-a.

Abraços.

 

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>

 main()
 {
    char TextInic[1000], TextFin[1000], SubTextExcl[1000], SubTextIncl[1000];
    char* pt;
    int i, j, ocor, count;

    while(1)
    {
       printf("\n\n Digite o texto ou 0 para sair: "); gets(TextInic); fflush(stdin);

       if(strcmp(TextInic, "0") == 0)
          break;

       printf("\n Digite o subtexto a ser excluido: "); gets(SubTextExcl); fflush(stdin);

       printf("\n Digite qual repeticao do subtexto a excluir (1, 2, ...): ");
       scanf("%d", &ocor); fflush(stdin);

       count = 1;
	   pt = strstr(TextInic, SubTextExcl);
       while((++count <= ocor)&&(pt != NULL))
          pt = strstr(pt + strlen(SubTextExcl), SubTextExcl);

       if(pt)
       {
          printf("\n Digite o subtexto a ser incluido: "); gets(SubTextIncl); fflush(stdin);

          i = 0;
          while(&TextInic[i] != pt)
          {
             TextFin[i] = TextInic[i];
             i++;
          }

          j = 0;
          while(SubTextIncl[j])
             TextFin[i++] = SubTextIncl[j++];

          for(j = strlen(TextInic) + strlen(SubTextExcl) - strlen(pt); j <= strlen(TextInic); i++, j++)
             TextFin[i] = TextInic[j];

          printf("\n\n O texto ficou assim: %s", TextFin);
       }
       else
          printf("\n O subtexto a ser excluido nao esta contido no texto.\n");
    }
    printf("\n\nFIM DO PROGRAMA");
 }

 

Share this post


Link to post
Share on other sites
HappyHippyHippo
#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 256
#define RemoveLineFeed(str, len) if ((str)[(len) - 1] == '\n') (str)[--(len)] = '\0'

int main(void)
{
  // variaveis
  char haystack[BUFFER_SIZE],
       needle[BUFFER_SIZE],
       substitute[BUFFER_SIZE],
       * check;
  size_t haystack_size,
         needle_size,
         substitute_size;

  // leitura das strings
  do
  {
    printf("Digite o texto original : ");
    fflush(stdout);
  } while (! fgets(haystack, BUFFER_SIZE, stdin) || ! haystack[0] || haystack[0] == '\n');
  haystack_size = strlen(haystack);

  do
  {
    printf("Digite o texto a ser pesquisado/alterado : ");
    fflush(stdout);
  } while (! fgets(needle, BUFFER_SIZE, stdin) || ! needle[0] || needle[0] == '\n');
  needle_size = strlen(needle);

  do
  {
    printf("Digite o texto ser substituido : ");
    fflush(stdout);
  } while (! fgets(substitute, BUFFER_SIZE, stdin) || ! substitute[0] || substitute[0] == '\n');
  substitute_size = strlen(substitute);

  RemoveLineFeed(haystack, haystack_size);
  RemoveLineFeed(needle, needle_size);
  RemoveLineFeed(substitute, substitute_size);

  // magia em meia duzia de linhas
  while ((check = strstr(haystack, needle)) != NULL)
  {
    void * remainder = (void *) ((size_t) check + needle_size);
    size_t shift = substitute_size - needle_size;

    memmove(remainder + shift, remainder, (size_t) haystack + haystack_size + 1 - (size_t) remainder);
    memcpy(check, substitute, substitute_size);
    haystack_size += shift;
  }

  printf("O texto final : %s\n", haystack);

  return 0;
}

 


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

Share this post


Link to post
Share on other sites
José Ol'Ivar

Obrigado pela ajuda, Hyppo, mas confesso que não entendi completamente seu código - como disse, estou apenas iniciando no aprendizado de programação (acabei de avançar ao capítulo de estruturas do livro do DAMAS), e muita coisa ali me passa batido.

Todavia, qual a estrutura dele que controla o caso de haver repetição da substring a substituir?

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.