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 store it all:
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 '\0' 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 = '\0';
return resultado;
}
Note that the above code allocates a string new, so if you’re going to replace the old one and it’s dynamically allocated, remember to call free()
in it! Note also that original
has not been touched and remains with the original value.
what is the type
Chris
?– mercador
It’s like char, I fixed it in editing.
– LUIZ