Jump to content

Remover todas as ocorrencias de um substring numa string em C.


revised
 Share

Recommended Posts

Boa tarde.

Preciso da ajuda na verficação do meu codigo.

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

int verificaSubstr(char*str,char*substr,int substrMax,int i){
   int j,flag=1;
   for (j=0;j<substrMax;j++){
       if (substr[j]!=str[i]){
           flag=0;
       }
       i++;
   }
   return(flag);
}

char removeSubstr(char*str,int strMax,int substrMax,int i){
   for (i=i;str[i]!='\0';i++){
       str[i]=str[i+substrMax+1];
   }
   str[i+1]='\0';
   return(*str);
}

void main(){
   char str[100],substr[20];
   int strMax,substrMax,i,flag;

   printf("Frase: "); scanf("%[^\n]s",&str);
   fflush(stdin);
   strMax=strlen(str);

   printf("\nRemover: "); scanf("%s",&substr);
   fflush(stdin);
   substrMax=strlen(substr);

   for (i=0;str[i]!='\0';i++){
       if(substr[0]==str[i]){
           flag=verificaSubstr(str,substr,substrMax,i);
           if (flag==1){
               removeSubstr(str,strMax,substrMax,i);
           }
       }
   }
   printf("%s\n\n",str);
   system("pause");
}

caso 1

Se eu escrever:

Input frase: Ricardo Miguel Mendes Pereira

Input remover: Miguel

Output: Ricardo Mendes Pereira

caso 2

Se eu escrever:

Input frase: Ricardo Miguel Miguel Mendes Pereira

Input remover: Miguel

Output: Ricardo Miguel Mendes Pereira

caso 3

Se eu escrever:

Input frase: Ricardo Miguel Miguel Miguel Miguel Miguel Mendes Pereira

Input remover: Miguel

Output: Ricardo Miguel Miguel Mendes Pereira

Ou seja no caso 1 tudo perfeito...

No caso 2 so apaga uma vez o "Miguel".

No caso 3 ele apaga 3x o miguel mas não apaga as 2 ultimas...

Ja dei aqui umas valentes voltas ao codigo e não consigo avançar no sentido de corrigir o codigo de maneira a ele apagar todas as ocorrencias...

Agradeço desde ja a ajuda que possam dar.

Edited by thoga31
GeSHi
Link to comment
Share on other sites

supostamente quando envio o valor de "i" para a função eu so retorno a string e a flag... o ~valor de "i" deveria ser exatamente igual e ele deveria continuar a na mesma posição do "for" que está fora das funções...

e fica, e o problema é exactamente esse ...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Achas que o codigo ta fixo ou podia ser melhorado?

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

#define MAX    100

void main() {
   char str[MAX] = {9},
        substr[MAX] = {9},
        *ptr = NULL;
   size_t str_length = 0,
          substr_length = 0;

   printf("Frase: ");
   scanf("%100[^\n]\n", &str);
   str_length = strlen(str);

   printf("\nRemover: ");
   scanf("%100[^\n]\n", &substr);
   substr_length = strlen(substr);

   while ((ptr = strstr(str, substr)) != NULL) {
       memmove(ptr,
               ptr + substr_length + 1,
               str_length - (ptr - str));
   }

   printf("\nfinal : %s\n", str);
   system("pause");
}
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Pois... o codigo está bem mais pequeno... e faz o mesmo lol...

O problema é que ainda não sei metade das instruções que utilizas-te.

Isso provavelmente é um nivel bem mais alto que o que tenho neste momento...

Mas devo la chegar com o tempo...

Entretanto vou tambem tentado compreender o memmove e afins para ver se evolu-o mais um bocado.

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
 Share

×
×
  • 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.