There is no escape: you will have to allocate another place to store your result. By doing this you can then replace your string and have enough space to save everything:
char *
substituir(char * original, char busca, char * subst) {
int i, num_inst;
char * ptr, * ptr2, * resultado;
/* conta o número de instâncias de busca em original */
for (ptr = original, num_inst = 0; *ptr; ptr ++) {
if (*ptr == busca) num_inst ++;
}
/* aloca memória suficiente para guardar o resultado */
resultado = malloc(
strlen(original)/* letras no original */
+ (strlen(subst) - 1) * num_inst /* número de caracteres extra para caberem as instâncias de subst */
+ 1 /* para o 'char *
substituir(char * original, char busca, char * subst) {
int i, num_inst;
char * ptr, * ptr2, * resultado;
/* conta o número de instâncias de busca em original */
for (ptr = original, num_inst = 0; *ptr; ptr ++) {
if (*ptr == busca) num_inst ++;
}
/* aloca memória suficiente para guardar o resultado */
resultado = malloc(
strlen(original)/* letras no original */
+ (strlen(subst) - 1) * num_inst /* número de caracteres extra para caberem as instâncias de subst */
+ 1 /* para o '%pre%' final */
);
if (resultado == NULL) return resultado; /* se não conseguiu alocar memória, retorne */
for (ptr = original, ptr2 = resultado;
* ptr; ) {
if (*ptr == busca) {
/* concatene a sequência de substituição e depois ache o fim da string */
strcat(ptr2, subst);
while (* ptr2) ptr2 ++;
ptr ++; // tem que avançar o ponteiro de original, também
} else {
/* copie o byte */
*ptr2 ++ = *ptr ++;
}
}
* ptr2 = '%pre%';
return resultado;
}
' final */
);
if (resultado == NULL) return resultado; /* se não conseguiu alocar memória, retorne */
for (ptr = original, ptr2 = resultado;
* ptr; ) {
if (*ptr == busca) {
/* concatene a sequência de substituição e depois ache o fim da string */
strcat(ptr2, subst);
while (* ptr2) ptr2 ++;
ptr ++; // tem que avançar o ponteiro de original, também
} else {
/* copie o byte */
*ptr2 ++ = *ptr ++;
}
}
* ptr2 = '%pre%';
return resultado;
}
Note that the above code allocates a new string , so if you replace the old one and it is dynamically allocated, remember to call free()
on it! Note also that original
was not touched and remains with the original value.