Newsgroup: it.comp.os.linux.development
Titolo: sostituzione in una stringa .... in C

salve a tutti.
Ho il seguente problema:
poniamo che io abbia la stringa come la seguente:
"ciao /$/ come stai ? sei sempre il solito /$/ non cambierai mai"
Ora, come potrei fare (in C) per sostituire ogni occorrenza di "/$/" con 
"pippo" ? cosi' che la stringa precedente diventi:
"ciao pippo come stai ? sei sempre il solito pippo non cambierai mai".
( la stringa che ho trovato come esempio e' orrenda, ma e' stata la 
prima che mi e' venuta in mente :) )
Grazie infinite


Non puoi. Forse...
Ogni stringa in C occupa uno spazio ben definito. Per cambiare il suo contenuto
puoi:
1) levare dei caratteri (basta mettere uno 0 alla nuova fine)
2) sostituire dei caratteri
3) aggiungere dei caratteri *solo* se hai dello spazio libero alla fine
Il trucco e` di pensare allo spazio di memoria occupato dalla stringa e
capire che non si puo` andare al di fuori di quello.
Se hai spazio libero:
char s[1000];
...
snprintf( s, 1000, "ciao %s come stai...", "pippo" );
Se non hai spazio libero, allora dovrai giocare di puntatori
char *s;
char *buffer[1000];
...
snprintf( buffer, 1000, "ciao %s come stai...", "pippo" );
<< se necessatio, libera lo spazio di s >>
s = &buffer; // statico, occhio a non riutilizzare buffer per altre cose!
oppure
s = strdup(buffer); // dinamico, bisogna fare un free()
In Java e` molto piu` facile...
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 In Java e` molto piu` facile...
Si, ma Java e' ad un altro livello di astrazione ... :)
Continuo a sbatterci la testa .... penso di essere ad una soluzione.
Ciao
	MaX

 "ciao pippo come stai ? sei sempre il solito pippo non cambierai mai".
Questo il codice che mi pare fare quanto da me precedentemente 
richiesto, chiunque veda migliorie da poter apportare non esiti a 
comunicarlo... grazie:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* subst(char* str, char* pattern, char* strToAdd)
{
    char* patternPointer;
    char* startPointer = str;
    char* newstr = (char*) malloc( sizeof(char)*1 );
    *(newstr)='\0';
    while((patternPointer = strstr(startPointer, pattern)) != NULL  )
    {
       newstr = (char*) realloc( newstr, sizeof(char) * ( strlen(newstr) 
+ ( patternPointer - startPointer ) + strlen(strToAdd) + 1 ) );
       strncat(newstr, startPointer, sizeof(char) * ( patternPointer - 
startPointer) );
       strcat(newstr, strToAdd);
       startPointer = (char*) (( sizeof(char) * strlen(pattern) ) + 
patternPointer);
    }
    newstr = (char*) realloc( newstr, sizeof(char) * ( strlen(newstr) + 
strlen(startPointer) + 1 ) );
    strcat(newstr, startPointer);
    return newstr;
}
int main(void)
{
    printf( "%s\n", subst("ciao /$/ come stai ? sei sempre il solito /$/ 
non cambierai mai", "/$/", "pippo") );
    return 1;
}

 comunicarlo... grazie:
]zac[
Nel pacchetto gesconf (' 
http://savannah.gnu.org/projects/gesconf
 ') c'è una
libreria per la manipolazioni di base delle stringhe (e altro).
C'è anche una funzione (' strrepl ') per il safe replace (la stringa
ritornata è limitata alla lunghezza richiesta e viene ritornato se il
replace avrebbe superato la lunghezza richiesta (con relativo messaggio di
errore contenente la stringa di dimensioni eccessiva (anche il messaggio è
limitato))).
Questo perché, con dati ostili (dati di cui non si ha il pieno e assoluto
controllo)  bisogna si evitare i buffer overflow, ma anche allocazioni di
memoria di dimensioni incontrollate, e contemporaneamente dare più
informazioni possibili sugli errori.
Le funzioni sono contenute nella ' anlibrary ' che gesconf utilizza a piene
mani.

 "ciao /$/ come stai ? sei sempre il solito /$/ non cambierai mai"
Santo PERL, libera nos a malo ... :-)

 Santo PERL, libera nos a malo ... :-)
Ma essendo un applicazione intrinsecamente scritta in C ....
Ciao

* YattaMaX [2006-04-08 15:43]:

Ci sono librerie per le espressioni regolari anche in C: vedi PCRE (Perl
Compatible Regular Expressions).
Ciao,
 Emmanuele.