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

 
Comptar el nombre de cops que una cadena està continguda en una altra

En aquesta pràctica farem servir la funció strstr() de la llibreria estàndard per comptar el nombre de cops que una cadena apareix en una altra cadena.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C anomenat m6p06.c i escriviu el següent codi:

// m6p06.c - comptar subcadenes  -
//aquest programa compta el nombre de cops que una cadena
//està continguda en una altra

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


int comptar(char*, char*);

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

   system("clear");

   printf("Teclegi el Text:\n");
   fgets(text,200,stdin);

   printf("Teclegi la subcadena:\n");
   scanf("%[^\n]",subcadena);

   printf("%d cops\n",comptar(text, subcadena));
   return 0;

}


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

   p=text;

   while(p){
      p=strstr(p,subcadena);

      if(p) {
         p=p+strlen(subcadena);
         i++;
      }

   }
return i;

}

 

Captura de l'execució del programa.

 

Explicació del programa

En aquest programa disposarem de dues cadenes entrades per teclat amb la funció gets(), és a dir, cadenes sense caràcters de retorn de línia. Les cadenes són: text[] d'un màxim de 199 caràcters, i subcadena[] d'un màxim de 9 caràcters (recordeu que es reserva un per al caràcter fi de cadena '\0').

La funció comptar() retornarà un enter que serà el nombre de cops que la cadena subcadena es troba en la cadena text.

La funció comptar() declara un punter p. A aquest punter se l'assigna la funció strstr(). Aquesta funció retorna un punter a la primera aparició de la subcadena en el text. Si la subcadena no apareix en el text, la funció strstr() retorna un punter NULL, cosa que fa que se surti del bucle.

Si la funció strstr() no torna un punter NULL vol dir que ha trobat una aparició de la subcadena. En aquest moment es fa:

 
 p=p+strlen(subcadena);
 i++;

D'aquesta forma, el punter p apuntarà al text just a continuació de la subcadena, per tal de poder aplicar de nou la funció strstr() a la resta de la cadena. També s'ha incrementat en 1 el comptador. Quan surti del bucle, aquesta variable i contindrà el nombre de cops que la subcadena apareix en el text.