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
}