How to replace a middle character of a string and change it by two characters?

0

For example,

Char s1 [  ] = "azul";
 Char S2 [ ] = "z";
Char S3 [ ] = "PP";

Puts(s1); //azul

Code to replace ...

Expected result:

Puts(s1); //aPPul

Note: I have been able to do this by changing 1 character by another, but by 1 by 2 and still have subsequent characters, no.

    
asked by anonymous 18.06.2017 / 21:40

1 answer

1

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.

    
19.06.2017 / 21:46