Mettiamo che io ho un testo di questo tipo:
char *stringa = "ciaaao come stttai?";
Dovrei scrivere una funzione che mi elimini i caratteri multipli e ritorni "ciao come stai?" ma non ho molte idee
qualcuno mi può aiutare ?
Mettiamo che io ho un testo di questo tipo:
char *stringa = "ciaaao come stttai?";
Dovrei scrivere una funzione che mi elimini i caratteri multipli e ritorni "ciao come stai?" ma non ho molte idee
qualcuno mi può aiutare ?
ma devi gestire anche il caso in cui ci siano parole con consonanti doppie? oppure basta che elimini qualsiasi lettera ripetuta?
Qualsiasi lettera ripetuta
Beh a livello algoritmico io utlizzerei 2 puntatori per scrollare la tua stringa di origine.
Il primo puntatore punta inizialmente al primo char e il secondo (p2) a p1 + 1
A questo punto verifico che *p1 == *p2
Se VERO incremento p1 e successivamente p2 = p1 + 1
Se FALSO scrivo il char puntato da p1 nella nuova stringa e incremento p1
Tutto si ripete sino a che non incontri il '\0'
Non ti scrivo il codice perchè sono un pò arrugginito con il C però il ragionamento dovrebbe funzionare
/**
questo è il main
provalo e dimmi se funziona
dovrebbe essere giusto, se non lo è fammi sapere gli dedico un po + di tempo
+ o meno è quello che ha detto mattneri in codice
*/
main(){
int i=0;
char stringa[]="ciiiiaaaooo commme ssttaai???";
char *a,*b;
a=stringa;
b=stringa+1;
do{
if(*a==*b)
compatta(a);
else{
a++;
b++;
}
}while(b<striga+strlen(stringa));
}
/**
questa è una funzione che richiamo,serve solo epr compattare il vettore stringa fa uno shift verso sinistra di una posizione nel nostro caso
perchè se non mi ricordo male, in ogni caso stringa è un puntatore costante, non può cambiare valore a meno chè, se non vuoi cose più semplici puoi allocare con malloc e liberare con free
*/
compatta(const char *v){
int i=0;
while(strlen(v)-1>i){
*(v+i)=*(v+i+1);
i++;
//v[i]=v[i+1];
}
}
Una soluzione alternativa : (no case-sensitive)
codice:#include <iostream> using namespace std; int main() { char *str = "Ccciiiaaaoo cooomMmmme ssstTtaaAiIi ????"; unsigned int i=0; for(unsigned int t=1; t<=strlen(str); t++) if( tolower(str[i]) != tolower(str[t]) ) str[++i] = str[t]; cout << str << endl << endl; system("PAUSE"); return 0; }
01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
All errors are undocumented features waiting to be discovered.