Enrere Mòdul 6
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Eliminar la primera aparició d'una subcadena

En aquesta pràctica implementarem una funció lleugerament més complicada que la funció de la pràctica anterior, ja que s'ha de moure els caràcters del seu lloc.

 

Desenvolupament de la pràctica

Definiu un projecte nou anomenat m6p08 i afegiu-li un arxiu de font C/C++ anomenat m6p08.cpp. Escriviu el següent codi:

 
//m6p08.cpp: Eliminar la primera aparició d'una subcadena

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


char *eliminar(char*, char*);

void main (void){
    char text[200];
    char subcadena[10];

    printf("Teclegi el Text:\n");
    gets(text);

    printf("Teclegi la subcadena:\n");
    gets(subcadena);

    printf("%s\n", eliminar(text, subcadena));

}

char *eliminar(char *text, char *subcadena){ 
    char *p;
    int i=0;

    p=text;

    p=strstr(p,subcadena);

    if(p){
        do{
            *p=*(p+strlen(subcadena));
            p++;
        }while (*(p+strlen(subcadena)-1));

    };

    return text;

}

Explicació del programa

En aquest programa s'implementa la funció eliminar que té el protocol:

char *eliminar(char *text, char *subcadena)

Aquesta funció busca en la cadena text, la cadena subcadena. Aquesta búsqueda es fa amb la funció de la llibreria estàndard strstr(). Aquesta funció torna un punter a la posició on apareix per primera vegada la subcadena subcadena en la cadena text. Si la subcadena no es troba a text, la funció strstr() torna un punter nul i se salta el bucle i acaba la funció eliminar(). Si la cadena es troba, el punter p apuntarà a la posició on comença aquesta subcadena. Llavors entrarà en la següent part de codi:

 
        do{
            *p=*(p+strlen(subcadena));
            p++;
        }while (*(p+strlen(subcadena)-1));

El que fa aquesta part del codi és desplaçar tots els caràcters que hi ha després de la subcadena en text (incloent el caràcter fi de cadena de text) a l'esquerra un nombre de posicions igual a la longitud de la subcadena:

 
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
text A i x ò   é s   u n a   p r o v a \0    
subcadena é s   \0                                
resultat A i x ò   u n a   p r o v a \0          

Aquest bucle es realitza fins que *(p+strlen(subcadena)-1) sigui el caràcter '\0'. El fet de restar -1 és degut a que la comprovació es fa després d'incrementar el punter p.