Oppure

Loading
10/02/10 18:32
MagoAntò
Un saluto a tutti. :)

Devo realizzare il seguente programma: "Utilizzando per le stringhe

- l’allocazione statica
- l’allocazione dinamica

scrivere una function C che sostituisca in un testo tutte le occorrenze di una data sottostringa S1 con un'altra S2 (le due sottostringhe possono avere anche lunghezze diverse)"


Premetto che non posso usare le funzioni memcpy e memset. Ho realizzato la function che agisce sulle stringhe dichiarate staticamente, ma è ancora da perfezionare: nello specifico, il programma non funziona correttamente quando S1 è minore di S2; il programma crasha o non sostituisce bene le stringhe. L'idea di base che ho avuto è quella di copiare tutto il testo in un array temporaneo, trovare le occorrenze di S1, sostituire S2 e, poi, inserire i caratteri cancellati dopo la sostituzione usando degli indici appositi. Il problema, a quanto ho capito, è il seguente: una volta inserita S2 in S1 una prima volta, il testo di base si "allunga" e, quindi, nel successivo inserimento gli indici sono sfalsati e l'operazione non viene eseguita correttamente. Ho provato ad inserire un contatore aggiuntivo (k), ma senza successo.

Questo è il codice (ancora da perfezionare, è proabile che in qualche punto non lo abbia sistemato per bene):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define size 200

void sostituisci_stringhe_statico (char testo [], char pattern [], char stringa_2 []);
void sostituisci_stringhe_dinamico (char *p_testo, char *p_pattern);

void main ()

{
	char testo [size];
	char pattern [size];
	char stringa_2 [size];
	char p_testo, p_pattern;
	short scelta;
	
	printf ("1. Eliminazione di stringa con allocazione statica\n2. Eliminazione di stringa con allocazione dinamica\n\nDigita la scelta: ");
	scanf ("%d", &scelta);

	if ((scelta != 1) && (scelta!=2))
		printf ("Scelta non valida!\n");
	else
		if (scelta == 1)
			sostituisci_stringhe_statico (testo, pattern, stringa_2);
		else
		{
				sostituisci_stringhe_dinamico (&p_testo, &p_pattern);
		}
}

void sostituisci_stringhe_statico (char testo [], char pattern [], char stringa_2 [])
{
	int i, j, k, conta, lunghezza_testo, lunghezza_pattern, lunghezza_stringa_2;

	char copia_testo [size];
	
	fflush (stdin);
	printf ("\nDigita il testo: ");
	gets (testo);
	
	fflush(stdin);
	printf ("\nDigita il pattern da ricercare: ");
	gets (pattern);

	fflush(stdin);
	printf ("\nDigita il pattern da sostituire: ");
	gets (stringa_2);
	
	lunghezza_testo = strlen (testo);
	lunghezza_pattern = strlen (pattern);
	lunghezza_stringa_2 = strlen (stringa_2);

	if (lunghezza_pattern<lunghezza_stringa_2)
	{
		strcpy (copia_testo,testo);
	}
	
	printf ("\n");

	k = 0;
	
	for (i=0; i<lunghezza_testo; i++)
	{
		conta = 0;
		
		if (strncmp (pattern, testo+i, lunghezza_pattern) == 0)
		{
			j=i;
			
			do
			{ 
				*(testo+j) = *(stringa_2+conta);
				conta++;
				j++;
				printf ("sostituisco\n");
			}
			while (conta<lunghezza_stringa_2);
			
			if (lunghezza_pattern > lunghezza_stringa_2)
			{
				printf ("pattern>stringa\n");
				j=i;
				
				do
				{
					*(testo+j+lunghezza_stringa_2) = *(testo+j+lunghezza_pattern);
					j++;
				}
				
				while (*(testo+j+lunghezza_pattern) != EOF);
			}
			
			else
			{
				if (lunghezza_pattern < lunghezza_stringa_2)
				{
					j=i;
					
					puts (copia_testo);
					
					printf ("%d\n", i);
					
					do
					{
						if (k<0)
						{
							*(testo+j+lunghezza_stringa_2) = *(copia_testo+j+lunghezza_pattern);
							printf ("%d\n",k);
							j++;
							lunghezza_testo = strlen (testo);
						}
						else
						{
							*(testo+j+lunghezza_stringa_2) = *(copia_testo+j+lunghezza_pattern-k);
							printf ("%d\n",k);
							j++;
							lunghezza_testo = strlen (testo);
						}
					}
					while (*(copia_testo+j+lunghezza_pattern) != EOF);
					//strcpy (copia_testo,testo);

					k++;

					printf ("Il testo finalez e': %s\n", testo);
				}
			}
		}
	}
	
	printf ("Il testo finale e': %s\n", testo);
}


Un aiuto? Grazie in anticipo :)
aaa