L'approccio più semplice per la modifica "in-place" è quello di usare un puntatore in lettura e uno in scrittura; per controllare se il carattere va bene puoi usare la funzione strchr per cercare nella stringa contenente i soli caratteri validi. Esempio:
codice:
#include <cstring>
// ...
void PurgeString(char * Str, const char * Valid)
{
const char * readPtr=Str;
char * writePtr=Str;
while(*readPtr)
{
if(std::strchr(Valid,*readPtr)!=NULL)
writePtr++;
*writePtr=*readPtr;
readPtr++;
}
*writePtr=0;
}
// ...
char stringa="Ciao mondo!";
char valid="AEIOUaeiou";
PurgeString(stringa, valid);
// stringa ora vale "iaooo"
D'altra parte, se tutto quello che vuoi è semplicemente tenere i caratteri alfabetici e maiuscoli, ti basta usare la funzione std::isupper per il controllo del carattere, che è molto più veloce che iterare su tutto un array ad ogni carattere (la funzione diventa O(N) invece di O(N*M), con N lunghezza della stringa e M numero di caratteri validi).