Equivalente de funcion REPLACE de vb en C ?

Iniciado por User, 17 Julio 2012, 21:47 PM

0 Miembros y 1 Visitante están viendo este tema.

User

Hola nuevamente haber si me orientan, deseo encontrar una fucion en C similar a REPLACE
de VB 6

Ejemplo : strNewDate = Replace("08/31/2001", "/", "-")

Estuve averiguando en funciones en C y entontre que para hacer eso debo usar 2 funciones

strstr <---- Para ubicar la palabra a remplazar.
strncpy <--- Para especificar la palabra y nro de caracteres a remplazar.

Quedando el code asi :





#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="Espero les vaya muy bien";
  char * pch;
  pch = strstr (str,"vaya");
  strncpy (pch,"haga",4);
  printf ("%s\n", str);
  return 0;
}


Quedando "Espero les haga muy bien"


Habra una manera mas practica como REPLACE en VB ? ... gracias por su apoyo.

DickGumshoe

Me parece que no hay ninguna función que sea igual a replace de VB... De todas formas he buscado aquí y no he encontrado lo que buscas... Así que supongo que la forma más práctica es como lo has hecho.

Saludos!

BlackZeroX

#2
http://foro.elhacker.net/programacion_cc/consulta_programa_para_parsear_csv-t365491.0.html;msg1760918#msg1760918



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* replace(const char *str, const char *find, const char *rep)
{ // Reemplaza UNO  A LA VEZ...
    char *ret = NULL;
    size_t strOln;
    size_t strFln;
    size_t strRln;
    const char *end[2];
    size_t sizeL;
    size_t sizeR;


    if (!str) return NULL;

    strOln = strlen(str);

    if (!find || (end[0] = strstr(str, find)) == NULL) {
        ret = (char*)malloc(strOln + 1);
        memcpy(ret, str, strOln + 1);
        return ret;
    }

    strRln = strlen(rep);
    strFln = strlen(find);

    end[1] = end[0] + strFln;

    sizeL = end[0] - str;
    sizeR = (str + strOln) - end[1];

    ret = (char*)malloc(sizeL + strRln + sizeR + 1);

    memcpy(ret, str, sizeL);
    memcpy((ret + sizeL), rep, strRln);
    memcpy((ret + sizeL + strRln), end[1], sizeR);

    ret[sizeL + strRln + sizeR] = '\0';

    return ret;
}

int main() {
    const char MSG[] = "% &";
    char* ret1;
    char* ret2;

    ret1 = replace(MSG, "%", "Hola");
    ret2 = replace(ret1, "&", "Mundo");

    puts(ret1);
    puts(ret2);

    free(ret1);
    free(ret2);

    getchar();

    return 0;
}



Dulces Lunas¡.
The Dark Shadow is my passion.

rir3760

#3
En relacion al programa de BlackZeroX (Astaroth):
end[1] = (char*)((size_t)end[0] + strFln);

/* ... */

memcpy((void*)((int)ret + sizeL + strRln), end[1], sizeR);

Esas conversiones no son necesarias. La primera porque el puntero resultante (sin conversiones) es del tipo apropiado y la segunda porque un puntero de cualquier tipo puede pasarse sin problemas a una función que espere uno de tipo "void *" (la única excepción son funciones con un tipo variable de argumentos como "printf" pero eso ya es otra historia).


Se puede crear una función que remplace las instancias de una subcadena por otra utilizando "strstr", "sprintf" y aritmética de punteros. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *remplazar(char const *cad, char const *sub, char const *rem);

int main(void)
{
  char *p = " xxxxx\n xxxxx\n xxxxx\n";
  char *q;
 
  printf("%s----\n", p);
  q = remplazar(p, "xxxxx", "Hello, world");
  printf("%s", q);
  free(q);
 
  return EXIT_SUCCESS;
}

char *remplazar(char const *cad, char const *sub, char const *rem)
{
  char *nueva;
  char const *p;
  char *q;
 
  size_t nc_cad = strlen(cad);
  size_t nc_sub = strlen(sub);
  size_t nc_rem = strlen(rem);
 
  if (nc_rem > nc_sub)
     nueva = malloc((nc_cad / nc_sub + 1) * nc_rem);
  else
     nueva = malloc(nc_cad + 1);
  if (nueva == NULL)
     return NULL;
 
  q = nueva;
  while ((p = strstr(cad, sub)) != NULL){
     q += sprintf(q, "%.*s%s", (int) (p - cad), cad, rem);
     cad = p + nc_sub;
  }
  q += sprintf(q, "%s", cad);
 
  if ((q = realloc(nueva, q - nueva + 1)) == NULL){
     free(nueva);
  }
  return q;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

BlackZeroX

@rir3760
Gracias por las aclaraciones ( estoy traumatizado con los casting de variables debido a que "siempre" me salen errores al asignarlos a una variable ).

--- Modifique mi código replace().

Dulces Lunas!¡.
The Dark Shadow is my passion.

User

Hola a todos, muchas gracias por el ejemplo ... me ayudan mucho .. saludos !!