strreplace em C

r3pek

Power Member
bem, andei à procura na net de um códigozinho k fizesse akela função. como não encontrei nada decidi fazer eu e partilha-la com o resto do pessoal para k se altem precisar da função como eu e não a encontrar, já tem aki uma ajuda.
Se o pessoal encontrar algum problema ou kiser alterar/acrescentar algo é na boa, esta é só a solução k eu arranjei.

Aki fica:
Código:
#include <string.h>
#include <stdlib.h>

unsigned char* strreplace(unsigned char* str_in, unsigned char* str_find, unsigned char* str_subst) {
        unsigned char* subst_pos = strstr(str_in, str_find);

        if (subst_pos == NULL)
                return NULL;

        unsigned char* result = calloc(strlen(str_in) - strlen(str_find) + strlen(str_subst) + 1, sizeof(unsigned char));
        strncpy(result, str_in, subst_pos - str_in);
        strcat(result, str_subst);
        strcat(result, str_in + (subst_pos - str_in) + strlen(str_find));

        return result;
}
axo k é facil perceber mas se tiver duvidas avisem.
 
Com um sprintf podias poupar uma ou duas linhas de código, mas se está a funcionar.. ;)

Pensaste no caso em que existe mais que um needle na haystack, ou para o que precisas assumes que não existe?
 
Com um sprintf podias poupar uma ou duas linhas de código, mas se está a funcionar.. ;)

Pensaste no caso em que existe mais que um needle na haystack, ou para o que precisas assumes que não existe?

só substitui o primeiro k encontra.... se calhar era fixe fazer para todos os possiveis :S k axas?
 
a pedido de muitas familias..... :)


Código:
#include <string.h>
#include <stdlib.h>

unsigned char* strreplace(unsigned char* str_in, unsigned char* str_find, unsigned char* str_subst) {
        unsigned char* subst_pos = strstr(str_in, str_find);

        if (subst_pos == NULL)
                return str_in;

        unsigned char* result = calloc(strlen(str_in) - strlen(str_find) + strlen(str_subst) + 1, sizeof(unsigned char));
        strncpy(result, str_in, subst_pos - str_in);
        strcat(result, str_subst);
        strcat(result, str_in + (subst_pos - str_in) + strlen(str_find));

        return strreplace(result, str_find, str_subst);
}
alteração muito pequenina como se pode ver...
 
Código:
strreplace("AXA", "", "A");
:007:.

as vezes ler as man pages ajuda ;) obrigado!

versão corrigida:

Código:
#include <string.h>
#include <stdlib.h>

unsigned char* strreplace(unsigned char* str_in, unsigned char* str_find, unsigned char* str_subst) {
        unsigned char* subst_pos = strstr(str_in, str_find);

        if ((subst_pos == NULL) || (strcmp(str_find, "") == 0))
                return str_in;

        unsigned char* result = calloc(strlen(str_in) - strlen(str_find) + strlen(str_subst) + 1, sizeof(unsigned char));
        strncpy(result, str_in, subst_pos - str_in);
        strcat(result, str_subst);
        strcat(result, str_in + (subst_pos - str_in) + strlen(str_find));

        return strreplace(result, str_find, str_subst);
}
 
Back
Topo