Newsgroup: it.comp.lang.c
Titolo: Sostituire i doppi apici " in una stringa con '

Ragazzi,
ho il seguente problema: ho una stringa, devo verificare se al suo
interno è presente il carattere doppi apici " e se c'è sostituirlo
con il singolo apice '
Ho provato con la funzione strstr(stringa, """) ma ho errore in
compilazione.
Se scrivessi strstr(pJBtitle, "A") non avrei problemi ma come faccio
con "???
Chi mi aiuta please?!?!
In JAVA avrei già fatto ma non conosco bene il C! 8-((((((((
Grazie a tutti

 compilazione.
Semplicemente il compilatore non capisce dove inizia e dove
finisce la stringa. L'apice doppio in C ha un significato
specifico per il compilatore.
Per dirgli di trattarlo com un carattere generico devi aggiungere
il carattere di escape ovvero lo slash.
Prova con 
strstr(stringa, "\"");
vedrai che compila.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 il carattere di escape ovvero lo slash.
Il carattere
\
e' il backslash. :-(
C:\>aio Angelo


Ok grazie compila!
Ma ora come faccio a sostituire il doppio apice con un singolo ' ???
La funzione strstr mi restituisce un char*, ho scritto il seguente
codice:
//Cerco " in stringa
      	  char* doppiApici = strstr(stringa, "\"");
      	  if ( doppiApici != NULL )
      	  {
      	  	//Sostituire " con '
                  }
Ed ora cosa ci metto nell'if?
Grazie 8-)
Angelo Paolitto ha scritto:


 con il singolo apice '
Scusa ma non fai prima a fare un ciclo che copia carattere per
carattere la stringa1 su stringa2 e se il carattere che legge
e' un " ci scrive un '?

 Ma ora come faccio a sostituire il doppio apice con un singolo ' ???
E studiare un po meglio il C prima di fare queste domande???
:-)
<CODE>
char stringaApici[] = "Questa e' una stringa con due doppi apici \"\"";
char* startP = NULL;
char* endP = NULL;
startP = stringaApici;
while(endP = strstr(startP, "\""))
{
   *endP = '\''; // Quesa istruzione sostituisce l'apice doppio
   endP = startP;
}
</CODE>
Questo pezzo di codice sostituisce tutti i doppi apici
che trova in una stringa. Il codice funziona, ma non ha
controlli, pertanto se lo usi lo fai a tuo rischio e
pericolo.
HTH
C:\>iao Angelo


si,
cosi sto facendo.
Credevo di trovare una funzione che facesse autormaticamente una
replace di un dato carattere con un altro, avrei preferito ...

Grazie!
Ora lo provo e studio meglio, consiglio sempre valido ...
Se ci fosse tempo ... e poi è dura tornare da JAVA a C 8-)

 
Non c'e'. E comunque, invece di strstr() perche' non strchr()?
O, meglio ancora:
void squote(char *s)
{
   if (s != NULL) {
     while (*s) {
       if (*s == '"') *s='\'';
       s++;
     }
   }
}
....
squote(mystring);
Qualunque metodo tu voglia utilizzare, devi poi stare attento alle 
stringhe costanti!
Una cosa del tipo:
   squote("Sentii: \"Ciao!\" e mi voltai di scatto");
ha buone probabilitą di generare un core dump.
Remo D.

Sto lavorando con i codici ASCII, mi risulta più facile.
Ecco la soluzione che ho abbozzato:
                  char* doppiApici = strstr(pJBtitle, "\"");
      	  if ( doppiApici != NULL )
      	  {
      	  	//Replace " -> '
      	  	int i = 0;
                                int lDA = strlen(pJBtitle);
      	  	for (i=0; i<lDA; i++)
      	  	{
      	  	     //Codice ASCII di " 34 / Codice ASCII di ' 39
      	  	     if ( pJBtitle[i] == 34 )
      	  	         pJBtitle[i] = 39;
      	  	}//endfor
      	 }
Che ne dite può fungere?

> Che ne dite può fungere?
Ma non hai un compilatore sottomano per provarla?

si,
a compilare compila.
Sto attendendo che mi preparino il tutto per eseguire un test, ci vuole
un pochino di tempo ...


Se guardi benen il codice che hai scritto, scorri la stringa 3 volte:
Prima con strstr() per cercare '"', poi con strlen() per calcolare la 
lunghezza e poi con il for per sostituire " con '.
La domanda è: perche'? Un ciclo solo basta ed avanza!
Remo D.

Giusto!
Potrei ottimizzare il tutto cosi:
                                for (i=0; i<strlen(pJBtitle); i++)
      	  	{
      	  	     //Codice ASCII di " 34 / Codice ASCII di ' 39
      	  	     if ( pJBtitle[i] == 34 )
      	  	         pJBtitle[i] = 39;
      	  	}//endfor
A volte preferisco scrivere 2 linee di codice in più cosi evito di
scasinare il pregresso!

>        pJBtitle[i] = 39;
A me cmq su
pJBtitle[i] = 39 ;
mi da un Bus Error.

> A me cmq su pJBtitle[i] = 39  mi da un Bus Error
Bus Error???
E che significa???
Io il test potrò eseguirlo domani, i dati provengono da mainframe e ci
vuole tempo per prepararli, mi sa che mi devo arrangiare con uno
stringone fisso scolpito nel codice ...


Se hai provato a scrivere su una stringa costante non è tanto strano.
Questo dovrebbe fare lo stesso effetto:
char *s;
s="pro\"va";


 
E preparati un file di prova?

>E preparati un file di prova?
La burocrazia!
Che rompi ... ora vado via, ci provo domani e vi aggiorno!
Grazie a tutti per l'aiuto!
PS: spero di non avere gli incubi con il bus error 8-))

> Se hai provato a scrivere su una stringa costante non è tanto strano.
Infatti ho risolto con:
char *string = strdup("Chicco \"Ciao\" prova");

> A me cmq su pJBtitle[i] = 39  mi da un Bus Error
Bus Error???
E che significa???
Io il test potrò eseguirlo domani, i dati provengono da mainframe e ci


>Se guardi benen il codice che hai scritto, scorri la stringa 3 volte:
Giusto!
Basterebbe solo:
                                for (i=0; i<strlen(pJBtitle); i++)
      	  	{
      	  	     //Codice ASCII di " 34 / Codice ASCII di ' 39
      	  	     if ( pJBtitle[i] == 34 )
      	  	         pJBtitle[i] = 39;
      	  	}
Avevo inserito il primo if per garantirmi che se non trovo i doppi
apici tutto funziona come sempre ...
A volte meglio scrivere 2 linee di codice in più però avere la
garanzia di non modificare il "pregresso", non so se mi spiego!

       	  	}
così invece la scorri N volte a causa della strlen :D
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> così invece la scorri N volte a causa della strlen :D
Se deve sostituire tutte le occorrenze non vedo altra soluzione.
Magari un bel while ( stringa[i] != '\0') forse eviterebbe di
chiamare la strlen, ma deve sempre cmq passarsela tutta.
-- 
Hi, I'm a .signature virus! Copy me to your .signature file and
help me propagate, thanks!

 chiamare la strlen, ma deve sempre cmq passarsela tutta.
Infatti,
ho preferito lavorare carattere per carattere, quidi il for è
necessario.
Dai primi test sembra fungere!
Grazie a tutti 8-))

> ho preferito lavorare carattere per carattere, 
Anche perche' avrei dei dubbi sulla possibilita' di farlo
in altra maniera!


 Se deve sostituire tutte le occorrenze non vedo altra soluzione.
visto che si tratta di un'operazione in cui la lunghezza della stringa non
cambia, anziché chiamare la strlen ad ogni iterazione potrebbe salvarsi la
lunghezza all'inizio:
int nLength = strlen(pJBtitle);
for (i = 0; i < nLength; i++)
{
  //Codice ASCII di " 34 / Codice ASCII di ' 39
  if ( pJBtitle[i] == 34 )
  {
    pJBtitle[i] = 39;
  }
}


 int nLength = strlen(pJBtitle);
A questo punto non farebbe prima ad usare un
while ( stringa[i] != '\0') ?


 while ( stringa[i] != '\0') ?
si :)
