PDA

View Full Version : ricerca e sostituzione stringhe C


Toni85
07-05-2007, 11:07
Allora devo ricercare all'interno una stringa che devo sostituire con un altra

esempio: oggi vado al mare, però al mare il tempo è brutto.

parola da ricercare e sostituire: mare
parole sostiutiva: montagna

Tuttavia quando vado a sostituire parole di lunghezza maggiore me le tronca( funziona solo con parole con stessa lunghezza)

così l'esempio diventa: oggi vado al mont, però al mont il tempo è brutto.

ecco un pezzo di codice significativo:
/* memorizza la posizione */
pos=ftell(fd);


/* legge una stringa */
res=fread(letto, sizeof(char), len, fd);
if( res<len )
break;


/* confronto ed eventuale sostituzione */
if( ! memcmp(argv[1], letto, len) ) {
fseek(fd, pos, SEEK_SET);
fwrite(argv[2], sizeof(char), len, fd);
}


Qualche idea del perchè??

cionci
07-05-2007, 11:10
Solitamente quando si fa una sostituzione di questo tipo si va a creare un altro file nel quale si mette il testo con le parole sostituite e poi si va ad eliminare il file vecchio e rinominare il nuovo con il nome del vecchio...

cionci
07-05-2007, 11:12
Il confronto fra stringhe fallo con strcmp...

Ziosilvio
07-05-2007, 11:13
Se fai caso alle due chiamate a fread e fwrite, ti accorgi che, in ciascuno dei due casi, la grandezza della zona interessata è sempre la stessa: len*sizeof(char).

Ho paura che il problema sia più complicato di così.
Io lavorerei su una copia del file originario, in cui inserisco volta per volta le righe modificate.
Inoltre, userei strcpy, strcat e strcmp, stando molto attento ad allocare ogni volta la memoria che serve con malloc e realloc (e ricordandomi di liberarla con free).

maulattu
08-05-2007, 18:58
Il confronto fra stringhe fallo con strcmp...

direi anche strncmp, così si ha più robustezza ;)

cionci
08-05-2007, 19:14
direi anche strncmp, così si ha più robustezza ;)
In effetti potrebbe essere bellino per fare la scansione di tutto il buffer alla ricerca della parola (senza terminare ogni volta le stringhe)...

Toni85
09-05-2007, 12:28
grazie