Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: User en 17 Julio 2012, 21:47 pm



Título: Equivalente de funcion REPLACE de vb en C ?
Publicado por: User en 17 Julio 2012, 21:47 pm
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 :





Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. {
  6.  char str[] ="Espero les vaya muy bien";
  7.  char * pch;
  8.  pch = strstr (str,"vaya");
  9.  strncpy (pch,"haga",4);
  10.  printf ("%s\n", str);
  11.  return 0;
  12. }

Quedando "Espero les haga muy bien"


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


Título: Re: Equivalente de funcion REPLACE de vb en C ?
Publicado por: DickGumshoe en 17 Julio 2012, 21:52 pm
Me parece que no hay ninguna función que sea igual a replace de VB... De todas formas he buscado aquí (http://www.cplusplus.com/reference/clibrary/cstring/) y no he encontrado lo que buscas... Así que supongo que la forma más práctica es como lo has hecho.

Saludos!


Título: Re: Equivalente de funcion REPLACE de vb en C ?
Publicado por: BlackZeroX en 17 Julio 2012, 21:59 pm
http://foro.elhacker.net/programacion_cc/consulta_programa_para_parsear_csv-t365491.0.html;msg1760918#msg1760918

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. char* replace(const char *str, const char *find, const char *rep)
  7. { // Reemplaza UNO  A LA VEZ...
  8.    char *ret = NULL;
  9.    size_t strOln;
  10.    size_t strFln;
  11.    size_t strRln;
  12.    const char *end[2];
  13.    size_t sizeL;
  14.    size_t sizeR;
  15.  
  16.  
  17.    if (!str) return NULL;
  18.  
  19.    strOln = strlen(str);
  20.  
  21.    if (!find || (end[0] = strstr(str, find)) == NULL) {
  22.        ret = (char*)malloc(strOln + 1);
  23.        memcpy(ret, str, strOln + 1);
  24.        return ret;
  25.    }
  26.  
  27.    strRln = strlen(rep);
  28.    strFln = strlen(find);
  29.  
  30.    end[1] = end[0] + strFln;
  31.  
  32.    sizeL = end[0] - str;
  33.    sizeR = (str + strOln) - end[1];
  34.  
  35.    ret = (char*)malloc(sizeL + strRln + sizeR + 1);
  36.  
  37.    memcpy(ret, str, sizeL);
  38.    memcpy((ret + sizeL), rep, strRln);
  39.    memcpy((ret + sizeL + strRln), end[1], sizeR);
  40.  
  41.    ret[sizeL + strRln + sizeR] = '\0';
  42.  
  43.    return ret;
  44. }
  45.  
  46. int main() {
  47.    const char MSG[] = "% &";
  48.    char* ret1;
  49.    char* ret2;
  50.  
  51.    ret1 = replace(MSG, "%", "Hola");
  52.    ret2 = replace(ret1, "&", "Mundo");
  53.  
  54.    puts(ret1);
  55.    puts(ret2);
  56.  
  57.    free(ret1);
  58.    free(ret2);
  59.  
  60.    getchar();
  61.  
  62.    return 0;
  63. }
  64.  
  65.  

Dulces Lunas¡.


Título: Re: Equivalente de funcion REPLACE de vb en C ?
Publicado por: rir3760 en 18 Julio 2012, 19:31 pm
En relacion al programa de BlackZeroX (Astaroth):
Código
  1. end[1] = (char*)((size_t)end[0] + strFln);
  2.  
  3. /* ... */
  4.  
  5. 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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char *remplazar(char const *cad, char const *sub, char const *rem);
  6.  
  7. int main(void)
  8. {
  9.   char *p = " xxxxx\n xxxxx\n xxxxx\n";
  10.   char *q;
  11.  
  12.   printf("%s----\n", p);
  13.   q = remplazar(p, "xxxxx", "Hello, world");
  14.   printf("%s", q);
  15.   free(q);
  16.  
  17.   return EXIT_SUCCESS;
  18. }
  19.  
  20. char *remplazar(char const *cad, char const *sub, char const *rem)
  21. {
  22.   char *nueva;
  23.   char const *p;
  24.   char *q;
  25.  
  26.   size_t nc_cad = strlen(cad);
  27.   size_t nc_sub = strlen(sub);
  28.   size_t nc_rem = strlen(rem);
  29.  
  30.   if (nc_rem > nc_sub)
  31.      nueva = malloc((nc_cad / nc_sub + 1) * nc_rem);
  32.   else
  33.      nueva = malloc(nc_cad + 1);
  34.   if (nueva == NULL)
  35.      return NULL;
  36.  
  37.   q = nueva;
  38.   while ((p = strstr(cad, sub)) != NULL){
  39.      q += sprintf(q, "%.*s%s", (int) (p - cad), cad, rem);
  40.      cad = p + nc_sub;
  41.   }
  42.   q += sprintf(q, "%s", cad);
  43.  
  44.   if ((q = realloc(nueva, q - nueva + 1)) == NULL){
  45.      free(nueva);
  46.   }
  47.   return q;
  48. }

Un saludo


Título: Re: Equivalente de funcion REPLACE de vb en C ?
Publicado por: BlackZeroX en 18 Julio 2012, 23:01 pm
@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!¡.


Título: Re: Equivalente de funcion REPLACE de vb en C ?
Publicado por: User en 25 Julio 2012, 01:07 am
Hola a todos, muchas gracias por el ejemplo ... me ayudan mucho .. saludos !!