Error in program execution involving pointers

Asked

Viewed 79 times

3

I was doing a C program that read string1 and deleted the first string2 occurrence. In string1:"Mouse Chewed Clothes" if I put "Ra" in string2, the program deletes correctly, without errors. But if I put "Ro" in string2, it gives error and closes.

Below is the commented code:

#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!='\0';*ptr1++, ptr2=s2)//ao invés de usar o s1[i]!='\0' 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]='\0'; //após tudo, é colocado um delimitador no final da string

return s1; //e s1 é retornado
}

2 answers

3

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

Follow a 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, "\0" );

    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):

$ gcc strrepstr.c -o strrepstr

Exit:

$ ./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

I hope I’ve helped!

1


I’ve been doing personal things here and I haven’t scheduled for four days. Today I decided to go back and redo the program, I managed to do it perfectly and I really liked the result, follows below 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!='\0';ptrs1++, ptrs2=s2)
{

    if(*ptrs1==*ptrs2&&procurar==0)
    {
        while(*ptrs2!='\0'&&*ptrs1==*ptrs2&&*ptrs1!='\0'&&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]='\0';
return s1;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.