Error in program execution involving pointers

3

I've been doing a program in C that read string1 and erased the first occurrence of string2. In string1: "Mouse Roasted Clothes" if I put "Ra" in string2, the program erases correctly, without errors. But if I put "Ro" in string2, it gives error and date.

  

Commented code below:

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

char *StrDelStr(char *s1, char *s2);//essa função deve apagar a primeira ocorrencia de s2 em s1

int main(void)
{
char string1[60], string2[30];

printf("digite uma string\n> "); gets(string1); fflush(stdin); //pega a primeira string
printf("digite uma outra string menor\n> "); gets(string2); fflush(stdin); //pega a segunda string
printf("\nstring ja transformada\n> %s\n", StrDelStr(string1, string2));

return 0;
}

char *StrDelStr(char *s1, char *s2)
{
int ocorrencia, i, j, tamanho_s2=strlen(s2), concordancia_s1_s2;
char *ptr1=s1, *ptr2=s2; //*ptr1 vai ser equivalente a s1 e *ptr2 vai ser equivalente a s2

for(ocorrencia=i=j=concordancia_s1_s2=0;*ptr1!='
#include <stdio.h>
#include <string.h>

char *StrDelStr(char *s1, char *s2);//essa função deve apagar a primeira ocorrencia de s2 em s1

int main(void)
{
char string1[60], string2[30];

printf("digite uma string\n> "); gets(string1); fflush(stdin); //pega a primeira string
printf("digite uma outra string menor\n> "); gets(string2); fflush(stdin); //pega a segunda string
printf("\nstring ja transformada\n> %s\n", StrDelStr(string1, string2));

return 0;
}

char *StrDelStr(char *s1, char *s2)
{
int ocorrencia, i, j, tamanho_s2=strlen(s2), concordancia_s1_s2;
char *ptr1=s1, *ptr2=s2; //*ptr1 vai ser equivalente a s1 e *ptr2 vai ser equivalente a s2

for(ocorrencia=i=j=concordancia_s1_s2=0;*ptr1!='%pre%';*ptr1++, ptr2=s2)//ao invés de usar o s1[i]!='%pre%' eu usei o *ptr1!='0' para percorrer a
{                                                                    //string, pq depois tenho que apagar os caracteres e o ptr2 é sempre zerado
    if(ocorrencia==0&&*ptr1==*ptr2)//aqui verifica se eu já apaguei algo antes e se *ptr1 é igual a *ptr2 
    {
        while(*ptr1==*ptr2)//se o if for atendido vai inciar o while com a condição de *ptr1==*ptr2
        {
            j++; //o j vai ser adicionado
            concordancia_s1_s2++; //tanto como o inteiro concordancia_s1_s2
            *ptr1++; *ptr2++; //aqui os ponteiros avançam uma posição char
        }
        if(concordancia_s1_s2==tamanho_s2) //quando o while for quebrado, esse if verifica se o concordancia_s1_s2 é igual ao tamnho de s2
            ocorrencia++; //se for, ocorrencia é adicionado impedindo o acesso à esse if
        else
            ptr1-=j; //caso não seja do mesmo temaznho, significa que não era s2 por completo dentro de s1, logo, *ptr regride
    }                //à posição que estava antes de entrar nesse if

    s1[i++]=*ptr1;//*ptr é escrito em i, que logo depois é adicionado
}
s1[i]='%pre%'; //após tudo, é colocado um delimitador no final da string

return s1; //e s1 é retornado
}
';*ptr1++, ptr2=s2)//ao invés de usar o s1[i]!='%pre%' eu usei o *ptr1!='0' para percorrer a { //string, pq depois tenho que apagar os caracteres e o ptr2 é sempre zerado if(ocorrencia==0&&*ptr1==*ptr2)//aqui verifica se eu já apaguei algo antes e se *ptr1 é igual a *ptr2 { while(*ptr1==*ptr2)//se o if for atendido vai inciar o while com a condição de *ptr1==*ptr2 { j++; //o j vai ser adicionado concordancia_s1_s2++; //tanto como o inteiro concordancia_s1_s2 *ptr1++; *ptr2++; //aqui os ponteiros avançam uma posição char } if(concordancia_s1_s2==tamanho_s2) //quando o while for quebrado, esse if verifica se o concordancia_s1_s2 é igual ao tamnho de s2 ocorrencia++; //se for, ocorrencia é adicionado impedindo o acesso à esse if else ptr1-=j; //caso não seja do mesmo temaznho, significa que não era s2 por completo dentro de s1, logo, *ptr regride } //à posição que estava antes de entrar nesse if s1[i++]=*ptr1;//*ptr é escrito em i, que logo depois é adicionado } s1[i]='%pre%'; //após tudo, é colocado um delimitador no final da string return s1; //e s1 é retornado }
    
asked by anonymous 23.07.2016 / 19:00

2 answers

1

I kept doing personal things here and stayed for four days without programming. Today I decided to go back and redo the program, I managed to do it perfectly and I really liked the result, here's the result:

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

char *StrDelStr(char *s1, char *s2);

int main(void)
{
char string1[100]="o rato roeu a rolha da garrafa de rum do rei da russia", string2[30];

printf("digite uma string\n> "); gets(string2); fflush(stdin); //pega a primeira string
printf("\nstring ja transformada\n> %s\n", StrDelStr(string1, string2));

return 0;
}

char *StrDelStr(char *s1, char *s2)
{
int verificadorI=strlen(s2), verificadorIII=0, procurar=0, i=0;
char *ptrs1=s1, *ptrs2=s2;

for(;*ptrs1!='
#include <stdio.h>
#include <string.h>

char *StrDelStr(char *s1, char *s2);

int main(void)
{
char string1[100]="o rato roeu a rolha da garrafa de rum do rei da russia", string2[30];

printf("digite uma string\n> "); gets(string2); fflush(stdin); //pega a primeira string
printf("\nstring ja transformada\n> %s\n", StrDelStr(string1, string2));

return 0;
}

char *StrDelStr(char *s1, char *s2)
{
int verificadorI=strlen(s2), verificadorIII=0, procurar=0, i=0;
char *ptrs1=s1, *ptrs2=s2;

for(;*ptrs1!='%pre%';ptrs1++, ptrs2=s2)
{

    if(*ptrs1==*ptrs2&&procurar==0)
    {
        while(*ptrs2!='%pre%'&&*ptrs1==*ptrs2&&*ptrs1!='%pre%'&&procurar==0)
        {
            ptrs1++; ptrs2++;
            verificadorIII++;
        }

        if(verificadorIII==verificadorI&&verificadorIII!=0)
            procurar=1;
        else
            if(verificadorIII!=verificadorI&&verificadorIII!=0)
            {
                ptrs1=ptrs1-verificadorIII;
                verificadorIII=0;
            }
    }

    s1[i++]=*ptrs1;
}
s1[i]='%pre%';
return s1;
}
';ptrs1++, ptrs2=s2) { if(*ptrs1==*ptrs2&&procurar==0) { while(*ptrs2!='%pre%'&&*ptrs1==*ptrs2&&*ptrs1!='%pre%'&&procurar==0) { ptrs1++; ptrs2++; verificadorIII++; } if(verificadorIII==verificadorI&&verificadorIII!=0) procurar=1; else if(verificadorIII!=verificadorI&&verificadorIII!=0) { ptrs1=ptrs1-verificadorIII; verificadorIII=0; } } s1[i++]=*ptrs1; } s1[i]='%pre%'; return s1; }
    
03.08.2016 / 22:31
3

How about using a substitution function to "delete" substrings from a string?

Here is a tried-and-tested example that solves your problem:

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

char * strrepstr( char * dst, const char * src, const char * oldstr, const char * newstr )
{
    char * p = NULL;
    char * aux = NULL;
    int oldstrlen = 0;

    oldstrlen = strlen( oldstr );

    p = strstr( src, oldstr );
    aux = (char*) src;

    strcpy( dst, "
$ gcc strrepstr.c -o strrepstr
" ); while( p ) { strncat( dst, aux, p - aux ); strcat( dst, newstr ); p += oldstrlen; aux = p; p = strstr( aux, oldstr ); } strcat( dst, aux ); return dst; } int main( void ) { const char * entrada = "O Rato Roeu a Roupa do Rei de Roma"; char saida[ 100 ]; printf( "%s\n", entrada ); printf( "%s\n", strrepstr( saida, entrada, "Ra", "" ) ); printf( "%s\n", strrepstr( saida, entrada, "Ro", "" ) ); printf( "%s\n", strrepstr( saida, entrada, "R", "L" ) ); printf( "%s\n", strrepstr( saida, entrada, "Rato", "Gato" ) ); printf( "%s\n", strrepstr( saida, entrada, "a Roupa", "o peh" ) ); return 0; } /* fim-de-arquivo */

Compiling (gcc / linux):

$ ./strrepstr 
O Rato Roeu a Roupa do Rei de Roma
O to Roeu a Roupa do Rei de Roma
O Rato eu a upa do Rei de ma
O Lato Loeu a Loupa do Lei de Loma
O Gato Roeu a Roupa do Rei de Roma
O Rato Roeu o peh do Rei de Roma

Output:

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

char * strrepstr( char * dst, const char * src, const char * oldstr, const char * newstr )
{
    char * p = NULL;
    char * aux = NULL;
    int oldstrlen = 0;

    oldstrlen = strlen( oldstr );

    p = strstr( src, oldstr );
    aux = (char*) src;

    strcpy( dst, "
$ gcc strrepstr.c -o strrepstr
" ); while( p ) { strncat( dst, aux, p - aux ); strcat( dst, newstr ); p += oldstrlen; aux = p; p = strstr( aux, oldstr ); } strcat( dst, aux ); return dst; } int main( void ) { const char * entrada = "O Rato Roeu a Roupa do Rei de Roma"; char saida[ 100 ]; printf( "%s\n", entrada ); printf( "%s\n", strrepstr( saida, entrada, "Ra", "" ) ); printf( "%s\n", strrepstr( saida, entrada, "Ro", "" ) ); printf( "%s\n", strrepstr( saida, entrada, "R", "L" ) ); printf( "%s\n", strrepstr( saida, entrada, "Rato", "Gato" ) ); printf( "%s\n", strrepstr( saida, entrada, "a Roupa", "o peh" ) ); return 0; } /* fim-de-arquivo */

I hope I have helped!

    
24.07.2016 / 02:46