Ciao ragazzi, sto effettuando un esercizio con la seguente traccia:
scrivere una function C che sostituisca in un testo tutte le occorrenze di una data sottostringa s1 con una sottostringa s2
(le due sottostringhe possono avere anche lunghezze diverse) con il minimo numero di spostamenti del blocco di memoria.
Sono riuscito a fare la parte che s1 = s2 e che s1 > s2, ma non riesco a fare quando s2 > s1...
Qualcuno sa aiutarmi?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sostituireoccorrenza_statica();
#define MAX_TEXT 250
#define MAX_PAT 10
#define MAX_OCCORRENZE 20
int main()
{
short int azione;
printf("Programmazione II - Esercizio 27\n\n");
do
{
printf("1 - Elimina occorrenze con allocazione statica\n");
printf("2 - Elimina occorrenze con allocazione dinamica\n");
printf("Inserisci = ");
scanf("%hd", &azione);
} while (azione != 1 && azione != 2);
if(azione == 1)
{
sostituireoccorrenza_statica();
} else
{
//eliminaoccorrenza_dinamica();
}
return 0;
}
void sostituireoccorrenza_statica()
{
char *testo;
char pattern[MAX_PAT];
char sub[MAX_PAT];
char *ch;
int i=0, j=0, k=0, l;
int occorrenze[MAX_OCCORRENZE], num_byte;
int lunghezza_testo, lunghezza_pattern, lunghezza_sub;
testo = (char *)malloc(200+1);
fflush(stdin);
printf("\nInserisci il testo (max %d caratteri)\n", MAX_TEXT-50);
gets(testo);
printf("\nInserisci il pattern da trovare nel testo (max %d caratteri)\n", MAX_PAT);
gets(pattern);
printf("\nInserisci la stringa da sostituire al pattern (max %d caratteri)\n", MAX_PAT);
gets(sub);
lunghezza_testo = strlen(testo);
lunghezza_pattern = strlen(pattern);
lunghezza_sub = strlen(sub);
do
{
ch = strstr(&testo[i], pattern);
if(ch != 0)
{
occorrenze[j] = (int)(ch - &testo[0]);
j++;
i = (int)(ch - &testo[0] + lunghezza_pattern);
}
} while (i < lunghezza_testo && ch != 0);
if(lunghezza_pattern == lunghezza_sub)
{
for(i=j-1;i>=0;i--)
{
l=0;
k = occorrenze[i];
while(l < lunghezza_sub)
{
testo[k] = sub[l];
k++;
l++;
}
}
} else if (lunghezza_pattern > lunghezza_sub)
{
for(i=j-1;i>=0;i--)
{
l=0;
k = occorrenze[i];
while(l < lunghezza_sub)
{
testo[k] = sub[l];
k++;
l++;
}
num_byte = lunghezza_testo - (int)(&testo[occorrenze[i]+lunghezza_sub]-&testo[0]);
memmove(&testo[occorrenze[i]+lunghezza_sub], &testo[occorrenze[i]+lunghezza_pattern], num_byte);
}
} else
{
testo = (char *)realloc(testo, lunghezza_testo+(j*(lunghezza_sub-lunghezza_pattern)));
for(i=j-1;i>=0;i--)
{
num_byte = lunghezza_testo - (int)(&testo[occorrenze[i]+lunghezza_sub]-&testo[0]);
memmove(&testo[occorrenze[i]+lunghezza_sub+(lunghezza_sub-lunghezza_pattern)], &testo[occorrenze[i]+lunghezza_pattern+1], num_byte);
l = 0;
k = occorrenze[i];
while(l < lunghezza_sub)
{
testo[k] = sub[l];
k++;
l++;
}
}
}
puts(testo);
}