View Full Version : [C] Questa funzione toglie i blank ripetuti?!
Matrixbob
02-02-2007, 23:10
Io l'ho scritta così, ma non mi pare fare quello che voglio.
/* Compatta gli spazi delle notizie mal formate */
void layout(char *notizia)
{
int i=0, ii=0, op=0, size=strlen(notizia);
char supporto[size];
supporto[0]='\0';
while (notizia[i]!='\0')
{
if (notizia[i]!=' ')
{
supporto[ii]=notizia[i];
i++;
ii++;
op=0;
}
else {
if (op==0)
{
supporto[ii]=notizia[i];
i++;
ii++;
op++;
}
else i++;
}
}
supporto[ii]='\0';
strcpy(notizia, supporto);
}
Non è che NON faccio tutto x riferimento coi parametri passati in quel modo?!
Io la richiamo così:
layout(buffer2);
Se ho capito bene, se nella stringa ci sono più spazi tra le parole, tu ne vuoi mettere solo 1, giusto??
Io farei così:
void compact_spaces (char *str)
{
char *wrt = str--;
int flag = 0;
do {
str++;
if (*str == ' ')
{
if (flag == 0)
{
flag = 1;
*wrt = *str;
wrt++;
}
}
else
{
flag = 0;
*wrt = *str;
wrt++;
}
} while (*str);
}
Matrixbob
03-02-2007, 12:04
Funziona bene, grazie.
EDIT
Anzi mi pare di no.
Matrixbob
03-02-2007, 18:54
Forse ho detto 1 cavolata, ma da qualche parte non ci deve essere:
*srt = *wrt;
Al posto di:
*wrt = *str;
Altrimenti alla fine la stringa in entrata come fa a risultare modificata?! :confused:
Forse la chiave di tutto è:
char *wrt = str--;
che mi indica che sto lavorando su 2 stringhe che però sono sovrapposte come celle di memoria?!
Quindi modificando wrt alla fine ho modificato anche str?! :mbe:
Se è così allora 6 il mago delle ottimizzazioni. :)
Forse ho detto 1 cavolata, ma da qualche parte non ci deve essere:
*srt = *wrt;
Al posto di:
*wrt = *str;
Altrimenti alla fine la stringa in entrata come fa a risultare modificata?! :confused:No, non c'è alcun bisogno. All'inizio 'wrt' e 'str' hanno lo stesso valore. 'str' viene incrementato ad ogni ciclo mentre 'wrt' viene incrementato solo quando un carattere viene copiato.
In pratica quando ci sono più spazi, 'wrt' si "ferma" mentre 'str' va comunque avanti. Quindi man mano che si va avanti, i caratteri vengono copiati più indietro.
Spero di essermi spiegato in modo chiaro.
Matrixbob
03-02-2007, 19:09
No, non c'è alcun bisogno. All'inizio 'wrt' e 'str' hanno lo stesso valore. 'str' viene incrementato ad ogni ciclo mentre 'wrt' viene incrementato solo quando un carattere viene copiato.
In pratica quando ci sono più spazi, 'wrt' si "ferma" mentre 'str' va comunque avanti. Quindi man mano che si va avanti, i caratteri vengono copiati più indietro.
Spero di essermi spiegato in modo chiaro.
Se è come ho editato sopra ora ho capito.
Matrixbob
03-02-2007, 19:12
Hai mica sottomano anche una funzione che faccia anche, solo parte di, questo:
[C] Esiste funzione che trasforma HTML in TXT?! (http://www.hwupgrade.it/forum/showthread.php?t=1396542)
In pratica il testo HTML io lo ho già tutto caricato in 1 stringa in quanto è corto.
Matrixbob
03-02-2007, 23:47
Eeehm :p
Ho 1 altro problema :( qui:
[C] Sostituire 1 sottostringa in 1 stringa: ho fatto questa funzione.. (http://www.hwupgrade.it/forum/showthread.php?p=15822544)
Ho provato a seguire la tua falsa riga, ma ho cannato... :cry:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.