Jump to content

Não consigo encontrar bug em código C


José Ol'Ivar

Recommended Posts

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

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

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

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

 #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");
 }
Link to comment
Share on other sites

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");
 }
Link to comment
Share on other sites

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

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?

Link to comment
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.