Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Sostituzione stringhe di diversa lunghezza
Forum - C/C++ - Sostituzione stringhe di diversa lunghezza

Avatar
MagoAntò (Normal User)
Rookie


Messaggi: 42
Iscritto: 07/02/2009

Segnala al moderatore
Postato alle 19:32
Mercoledì, 10/02/2010
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):
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define size 200
  6.  
  7. void sostituisci_stringhe_statico (char testo [], char pattern [], char stringa_2 []);
  8. void sostituisci_stringhe_dinamico (char *p_testo, char *p_pattern);
  9.  
  10. void main ()
  11.  
  12. {
  13.         char testo [size];
  14.         char pattern [size];
  15.         char stringa_2 [size];
  16.         char p_testo, p_pattern;
  17.         short scelta;
  18.        
  19.         printf ("1. Eliminazione di stringa con allocazione statica\n2. Eliminazione di stringa con allocazione dinamica\n\nDigita la scelta: ");
  20.         scanf ("%d", &scelta);
  21.  
  22.         if ((scelta != 1) && (scelta!=2))
  23.                 printf ("Scelta non valida!\n");
  24.         else
  25.                 if (scelta == 1)
  26.                         sostituisci_stringhe_statico (testo, pattern, stringa_2);
  27.                 else
  28.                 {
  29.                                 sostituisci_stringhe_dinamico (&p_testo, &p_pattern);
  30.                 }
  31. }
  32.  
  33. void sostituisci_stringhe_statico (char testo [], char pattern [], char stringa_2 [])
  34. {
  35.         int i, j, k, conta, lunghezza_testo, lunghezza_pattern, lunghezza_stringa_2;
  36.  
  37.         char copia_testo [size];
  38.        
  39.         fflush (stdin);
  40.         printf ("\nDigita il testo: ");
  41.         gets (testo);
  42.        
  43.         fflush(stdin);
  44.         printf ("\nDigita il pattern da ricercare: ");
  45.         gets (pattern);
  46.  
  47.         fflush(stdin);
  48.         printf ("\nDigita il pattern da sostituire: ");
  49.         gets (stringa_2);
  50.        
  51.         lunghezza_testo = strlen (testo);
  52.         lunghezza_pattern = strlen (pattern);
  53.         lunghezza_stringa_2 = strlen (stringa_2);
  54.  
  55.         if (lunghezza_pattern<lunghezza_stringa_2)
  56.         {
  57.                 strcpy (copia_testo,testo);
  58.         }
  59.        
  60.         printf ("\n");
  61.  
  62.         k = 0;
  63.        
  64.         for (i=0; i<lunghezza_testo; i++)
  65.         {
  66.                 conta = 0;
  67.                
  68.                 if (strncmp (pattern, testo+i, lunghezza_pattern) == 0)
  69.                 {
  70.                         j=i;
  71.                        
  72.                         do
  73.                         {
  74.                                 *(testo+j) = *(stringa_2+conta);
  75.                                 conta++;
  76.                                 j++;
  77.                                 printf ("sostituisco\n");
  78.                         }
  79.                         while (conta<lunghezza_stringa_2);
  80.                        
  81.                         if (lunghezza_pattern > lunghezza_stringa_2)
  82.                         {
  83.                                 printf ("pattern>stringa\n");
  84.                                 j=i;
  85.                                
  86.                                 do
  87.                                 {
  88.                                         *(testo+j+lunghezza_stringa_2) = *(testo+j+lunghezza_pattern);
  89.                                         j++;
  90.                                 }
  91.                                
  92.                                 while (*(testo+j+lunghezza_pattern) != EOF);
  93.                         }
  94.                        
  95.                         else
  96.                         {
  97.                                 if (lunghezza_pattern < lunghezza_stringa_2)
  98.                                 {
  99.                                         j=i;
  100.                                        
  101.                                         puts (copia_testo);
  102.                                        
  103.                                         printf ("%d\n", i);
  104.                                        
  105.                                         do
  106.                                         {
  107.                                                 if (k<0)
  108.                                                 {
  109.                                                         *(testo+j+lunghezza_stringa_2) = *(copia_testo+j+lunghezza_pattern);
  110.                                                         printf ("%d\n",k);
  111.                                                         j++;
  112.                                                         lunghezza_testo = strlen (testo);
  113.                                                 }
  114.                                                 else
  115.                                                 {
  116.                                                         *(testo+j+lunghezza_stringa_2) = *(copia_testo+j+lunghezza_pattern-k);
  117.                                                         printf ("%d\n",k);
  118.                                                         j++;
  119.                                                         lunghezza_testo = strlen (testo);
  120.                                                 }
  121.                                         }
  122.                                         while (*(copia_testo+j+lunghezza_pattern) != EOF);
  123.                                         //strcpy (copia_testo,testo);
  124.  
  125.                                         k++;
  126.  
  127.                                         printf ("Il testo finalez e': %s\n", testo);
  128.                                 }
  129.                         }
  130.                 }
  131.         }
  132.        
  133.         printf ("Il testo finale e': %s\n", testo);
  134. }



Un aiuto? Grazie in anticipo :)

PM Quote