Originariamente inviato da oregon
La funzione sostituisci, cosi' scritta, puo' incorrere in un "pericoloso" buffer overflow, ad esempio, quando il carattere

'p'

si trova all'ultimo o al penultimo posto della stringa ...
Osservazione giustissima!!
Dovrebbe bastare modificare di poco il primo for, quello più esterno:

codice:
for(int i=0; i<d - 2; i++)
Originariamente inviato da cleaner
Originariamente inviato da menphisx
codice:
char a[d];

è vietato dallo standard.
In che senso è vietato? Io ho imparato che un array si dichiara in questo modo:
tipo NomeArray[numeroelementi]
ho sbagliato perchè non ho definito la dimensione di d a priori?
Esatto.

codice:
if(a[i] == 'p' || 'e' || 'r') a[i]='x';
E' sbagliatissimo. quello che avresti voluto fare si scrive così:

codice:
if(a[i] == 'p' || a[i] == 'e' || a[i] == 'r') a[i]='x';
Fai attenzione, perché nel modo scritto da te, il compilatore non dà nessun errore poiché sintatticamente è corretto, ma il significato è sbagliato. In quel modo la condizione dell'if è sempre vera perché fai un OR con le codifiche ascii di 'e' e di 'r' che sono sempre diverse da 0 o da NULL.

Originariamente inviato da cleaner
Non sapendo come funzionano i puntatori, il primo parametro della funzione non riesco ancora a capirlo..pensavo si potesse fare anche anche solo tramite array.
Puoi tranquillamente sostituire char *a con char a[], funziona ugualmente.