Newsgroup: it.comp.lang.c
Titolo: Cerca e sostituisci...!!! HELP

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int bool;
int i,j,z;
char *a, *b;
//......................PROTOTIPI DELLE
FUNZIONI..............................//
char *sottostringa (char *p, char *s);
bool SostPrimaOcc (char *vecchia, char *nuova, char *sorg, char
*dest);
//............................................................................//
/*
char *sottostringa (char *p, char *s)
cerca da sinistra la prima occorrenza della stringa puntata da p nella
stringa 
puntata da s; nel caso in cui la trovi restituisce il puntatore
all'inzio della 
sua prima occorrenza in s; restituisce NULL se p non occorre in s.
*/
char *sottostringa (char *p, char *s)
{
  int c;
  for(c=0;p[c];c++)
  {
   a = &p[c];
   b = s;
 
   while(*b && *b == *a)
   {
    a++;
    b++;
   }
   if(!*b)
    {
    z = c;
    return a;
    }
  }
  return NULL;   
}
FIN QUI CI SIAMO...FUNZIONA CORRETTAMENTE...ORA INIZIANO I PROBLEMI
CON QUESTA FUNZIONE....
/*
bool SostPrimaOcc (char* vecchia, char* nuova, char* sorg, char* dest)
effettua una copia di sorg (la sorgente) in dest (destinazione)
rimpiazzando 
l'eventuale prima occorrenza di vecchia con un'occorrenza di nuova; in
caso non 
vi siano occorrenze di vecchia in sorg, dest deve essere una copia di
sorg. 
Es. se vecchia == "rossa", nuova == "gialla", sorg == "la casa rossa"
allora, 
dopo l'esecuzione, dest == "la casa gialla". Restituisce VERO o FALSO
a seconda 
che abbia effettuato la sostituzione o no.
*/
//nel caso non sia nul vai fino al puntatore
bool SostPrimaOcc (char *vecchia, char *nuova, char *sorg, char *dest)
{
  char *res2="p";
  int m,n;
  n=0;
  if (sottostringa(sorg,vecchia) != NULL)
   {
          for(n=0;n<z;n++)
          {
          sorg=&dest[n];
          }
         for(z;z<40;z++)
          {
          res2=&dest[z];  <--- //NON CAPISCO PERCHE QUESTO NON VIENE
ESEGUITO!!!
          }
   }     
  printf("\n\nrisultato\n");
  printf("\n %s", dest);
  //MANCANO I RETURN TRUE o FALSE MA TANTO X ADESSO NON VA LA
FUNZIONE!!!
}
int main(void)
{ 
  char s1[80], s2[80];
  char *res, *b1, *b2; 
  int i=0;
 /* printf("inserisci prima stringa \n");
  gets(s1);
  printf("inserisci seconda stringa \n");
  gets(s2);
 
  b1 = s1;
  b2 = s2;
 
  res = sottostringa(b2,b1);
 
   while(res == NULL && i < 80)
   {
    res = sottostringa(b2,b1);
    i++;
   } 
   if(res != NULL)
    printf("Indice della prima occorrenza... %d", z);
   else
    printf("nessuna occorrenza");
  */
  SostPrimaOcc("rossa","gialla","La casa rossa","La casa gialla");
  getch();
 
  return 0;
 
}

 VIENE ESEGUITO!!!
non puoi cambiarne il valore.
Provo a mettere qualcosa a posto.
----8<------8<------8<------8<------8<------8<------8<------8<--
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef int bool;
char *sottostringa (char *p, char *s);
bool SostPrimaOcc (char *vecchia, char *nuova, char *sorg, char *dest);
char *sottostringa (char *p, char *s)
{
    int c;
    char *a, *b;
    for(c=0;p[c];c++)
    {
        a = &p[c];
        b = s;
        while(*b && *b == *a)
        {
            a++;
            b++;
        }
        if(!*b)
        {
            /* Ritornavi NULL perche' anche "a" ora punta
               a fine stringa e non l'inizio
            */
            return &p[c];
        }
    }
    return NULL;
}
bool SostPrimaOcc (char *vecchia, char *nuova, char *sorg, char *dest)
{
  char *res1,*res2;
  int n;
  /* default: copi TUTTA sorg in dest */
  res1=sorg;
  res2=dest;
  while(*res1)
  {
    *res2++=*res1++;
  }
  *res2='\0';
  /* res1 = puntatore all'inizio di "rossa" o NULL */
  res1=sottostringa(sorg,vecchia);
  if (res1 != NULL)
  {
    /* puntatore di "rossa" su dest, che va sovrascritto con "gialla" */
    res2=dest+(res1-sorg);
    /* copiamo solo gli n caratteri di vecchia stringa */
    for(n=0;vecchia[n];n++)
    {
      res2[n]=nuova[n];
    }
  }
  return (res1 != NULL);
}
int main(void)
{
  char vecchia[]= "rossa"  ;
  char nuova[]=  "gialla" ;
  char sorg[80]="La casa rossa dove sta?"  ;
  char dest[80] ;
  if( SostPrimaOcc(vecchia,nuova,sorg,dest) )
    printf("%s\n",dest);
  else
    printf("Non trovato, %s\n",dest);
  getchar();
  return 0;
}
----8<------8<------8<------8<------8<------8<------8<------8<--
le 2 funzioni, una volta imparato come funzionano facendo tutto a manina
coi puntatori carattere per carattere, preferirei scriverle cosi':
----8<------8<------8<------8<------8<------8<------8<------8<--
char *sottostringa (char *p, char *s)
{
  char *a;
  int l;
  l=strlen(s);
  a=p;
  while(*a)
  {
    if(strncmp(a,s,l)==0)
      return a;
    a++;
  }
  return NULL;
}
bool SostPrimaOcc (char *vecchia, char *nuova, char *sorg, char *dest)
{
  char *res1;
   strcpy(dest,sorg);
   res1=sottostringa(sorg,vecchia);
  if (res1 != NULL)
  {
     strcpy(dest+(res1-sorg),nuova);
     strcat(dest,res1+strlen(vecchia));
  }
  return (res1 != NULL);
}
----8<------8<------8<------8<------8<------8<------8<------8<--
HTH
-- 
-=[]=---iAN CooG---=[]=-
Who is General Failure and why is he reading my disk?